Path: blob/master/runtime/gc_verbose_old/VerboseManagerOld.cpp
5985 views
1/*******************************************************************************2* Copyright (c) 1991, 2020 IBM Corp. and others3*4* This program and the accompanying materials are made available under5* the terms of the Eclipse Public License 2.0 which accompanies this6* distribution and is available at https://www.eclipse.org/legal/epl-2.0/7* or the Apache License, Version 2.0 which accompanies this distribution and8* is available at https://www.apache.org/licenses/LICENSE-2.0.9*10* This Source Code may also be made available under the following11* Secondary Licenses when the conditions for such availability set12* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU13* General Public License, version 2 with the GNU Classpath14* Exception [1] and GNU General Public License, version 2 with the15* OpenJDK Assembly Exception [2].16*17* [1] https://www.gnu.org/software/classpath/license.html18* [2] http://openjdk.java.net/legal/assembly-exception.html19*20* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception21*******************************************************************************/2223#include "gcutils.h"24#include "modronnls.h"2526#include <string.h>2728#include "EnvironmentBase.hpp"29#include "VerboseEventAFEnd.hpp"30#include "VerboseEventAFStart.hpp"31#include "VerboseEventClassUnloadingEnd.hpp"32#include "VerboseEventClassUnloadingStart.hpp"33#include "VerboseEventCompactEnd.hpp"34#include "VerboseEventCompactStart.hpp"35#include "VerboseEventCompletedConcurrentSweep.hpp"36#include "VerboseEventConcurrentAborted.hpp"37#include "VerboseEventConcurrentEnd.hpp"38#include "VerboseEventConcurrentFinalCardCleaningEnd.hpp"39#include "VerboseEventConcurrentFinalCardCleaningStart.hpp"40#include "VerboseEventConcurrentHalted.hpp"41#include "VerboseEventConcurrentKickOff.hpp"42#include "VerboseEventConcurrentlyCompletedSweepPhase.hpp"43#include "VerboseEventConcurrentCompleteTracingEnd.hpp"44#include "VerboseEventConcurrentCompleteTracingStart.hpp"45#include "VerboseEventConcurrentRSScanEnd.hpp"46#include "VerboseEventConcurrentRSScanStart.hpp"47#include "VerboseEventConcurrentStart.hpp"48#include "VerboseEventCopyForwardAbortRaised.hpp"49#include "VerboseEventExcessiveGCRaised.hpp"50#include "VerboseEventGCInitialized.hpp"51#include "VerboseEventGlobalGCEnd.hpp"52#include "VerboseEventGlobalGCStart.hpp"53#include "VerboseEventHeapResize.hpp"54#include "VerboseEventLocalGCEnd.hpp"55#include "VerboseEventLocalGCStart.hpp"56#include "VerboseEventMarkEnd.hpp"57#include "VerboseEventMarkStart.hpp"58#include "VerboseEventMetronomeCycleEnd.hpp"59#include "VerboseEventMetronomeCycleStart.hpp"60#include "VerboseEventMetronomeGCEnd.hpp"61#include "VerboseEventMetronomeGCStart.hpp"62#include "VerboseEventMetronomeNonMonotonicTime.hpp"63#include "VerboseEventMetronomeSynchronousGCEnd.hpp"64#include "VerboseEventMetronomeSynchronousGCStart.hpp"65#include "VerboseEventMetronomeTriggerEnd.hpp"66#include "VerboseEventMetronomeTriggerStart.hpp"67#include "VerboseEventMetronomeOutOfMemory.hpp"68#include "VerboseEventMetronomeUtilizationTrackerOverflow.hpp"69#include "VerboseEventPercolateCollect.hpp"70#include "VerboseEventSweepEnd.hpp"71#include "VerboseEventSweepStart.hpp"72#include "VerboseEventSystemGCEnd.hpp"73#include "VerboseEventSystemGCStart.hpp"74#include "VerboseEventTarokIncrementEnd.hpp"75#include "VerboseEventTarokIncrementStart.hpp"76#include "VerboseFileLoggingOutput.hpp"77#include "GCExtensions.hpp"78#include "VerboseOutputAgent.hpp"79#include "VerboseStandardStreamOutput.hpp"80#include "VerboseTraceOutput.hpp"81#include "VerboseManagerOld.hpp"82#include "VerboseEventStream.hpp"838485extern "C" {8687/**88* Generate a verbosegc event object89* This function is called whenever a hook is received (all hooked events point at this function). A90* different userData will be passed for each event type - this function pointer is then dereferenced91* to instantiate the correct type.92*93* @param eventData Pointer to the event-specific structure containing the data for this hook.94* @param userData void* function pointer to the newInstance() method of the event type for this hook.95*/96void97generateVerbosegcEvent(J9HookInterface** hook, UDATA eventNum, void* eventData, void* userData)98{99MM_VerboseEventStream *eventStream;100101/* call the function pointer - this will call the newInstance()102* method that corresponds to the event type we have received. */103MM_VerboseEvent *event = ((MM_VerboseEvent *(*)(void *, J9HookInterface**))userData)(eventData,hook);104MM_EnvironmentBase *env = MM_EnvironmentBase::getEnvironment(event->getThread());105106if (NULL != event) {107MM_VerboseManagerOld *verboseManager = (MM_VerboseManagerOld*) MM_GCExtensions::getExtensions(event->getThread()->_vm)->verboseGCManager;108eventStream = verboseManager->getEventStreamForEvent(event);109110eventStream->chainEvent(env, event);111if (event->endsEventChain()) {112eventStream->processStream(env);113}114}115}116117}118119/**120* Create a new MM_VerboseManagerOld instance.121* @return Pointer to the new MM_VerboseManagerOld.122*/123MM_VerboseManagerOld *124MM_VerboseManagerOld::newInstance(MM_EnvironmentBase *env, OMR_VM* vm)125{126MM_GCExtensions* extensions = MM_GCExtensions::getExtensions(vm);127128MM_VerboseManagerOld *verboseManager = (MM_VerboseManagerOld *)extensions->getForge()->allocate(sizeof(MM_VerboseManagerOld), MM_AllocationCategory::FIXED, J9_GET_CALLSITE());129if (verboseManager) {130new(verboseManager) MM_VerboseManagerOld(vm);131if(!verboseManager->initialize(env)) {132verboseManager->kill(env);133verboseManager = NULL;134}135}136return verboseManager;137}138139/**140* Kill the MM_VerboseManagerOld instance.141* Tears down the related structures and frees any storage.142*/143void144MM_VerboseManagerOld::kill(MM_EnvironmentBase *env)145{146tearDown(env);147148MM_GCExtensions* extensions = MM_GCExtensions::getExtensions(env->getOmrVM());149extensions->getForge()->free(this);150}151152/**153* Initializes the MM_VerboseManagerOld instance.154*/155bool156MM_VerboseManagerOld::initialize(MM_EnvironmentBase *env)157{158PORT_ACCESS_FROM_ENVIRONMENT(env);159MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env->getOmrVM());160_mmHooks = J9_HOOK_INTERFACE(extensions->hookInterface);161_mmPrivateHooks = J9_HOOK_INTERFACE(extensions->privateHookInterface);162_omrHooks = J9_HOOK_INTERFACE(extensions->omrHookInterface);163164/* Create the Event Stream */165if(NULL == (_eventStream = MM_VerboseEventStream::newInstance(env, this))) {166return false;167}168169_lastOutputTime = j9time_hires_clock();170171return true;172}173174/**175* Tear down the structures managed by the MM_VerboseManagerOld.176* Tears down the event stream and output agents.177*/178void179MM_VerboseManagerOld::tearDown(MM_EnvironmentBase *env)180{181disableVerboseGC();182183if(NULL != _eventStream) {184_eventStream->kill(env);185_eventStream = NULL;186}187188MM_VerboseOutputAgent *agent = _agentChain;189_agentChain = NULL;190191while(NULL != agent) {192MM_VerboseOutputAgent *nextAgent = agent->getNextAgent();193agent->kill(env);194agent = nextAgent;195}196}197198/**199* Get the event stream which the given event should be added to.200*/201MM_VerboseEventStream *202MM_VerboseManagerOld::getEventStreamForEvent(MM_VerboseEvent *event)203{204MM_VerboseEventStream *eventStream;205206if(event->isAtomic()) {207/* Use a thread-local event-stream */208eventStream = MM_VerboseEventStream::newInstance(MM_EnvironmentBase::getEnvironment(event->getThread()), this);209if(NULL == eventStream) {210/* Error - use the main event stream and hope for the best */211eventStream = _eventStream;212} else {213/* This is a one time event stream for an atomic event - when the event214* stream is done being processed, it should be disposed of immediately.215*/216eventStream->setDisposable(true);217}218} else {219/* Use the main event-stream */220eventStream = _eventStream;221}222223return eventStream;224}225226void227MM_VerboseManagerOld::closeStreams(MM_EnvironmentBase *env)228{229MM_VerboseOutputAgent *agent = _agentChain;230while(NULL != agent) {231agent->closeStream(env);232agent = agent->getNextAgent();233}234}235236/**237* Adds an output agent to the output agent chain.238* @param agent Pointer to the agent to be added.239*/240void241MM_VerboseManagerOld::chainOutputAgent(MM_VerboseOutputAgent *agent)242{243agent->setNextAgent(_agentChain);244_agentChain = agent;245}246247void248MM_VerboseManagerOld::enableVerboseGC()249{250MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(_omrVM);251252if (!_hooksAttached){253(*_omrHooks)->J9HookRegisterWithCallSite(_omrHooks, J9HOOK_MM_OMR_INITIALIZED, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventGCInitialized::newInstance);254255if (extensions->isMetronomeGC()) {256enableVerboseGCRealtime();257} else {258enableVerboseGCNonRealtime();259}260261if (extensions->isVLHGC()) {262enableVerboseGCVLHGC();263}264265_hooksAttached = true;266}267}268269270void271MM_VerboseManagerOld::disableVerboseGC()272{273if (_hooksAttached){274MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(_omrVM);275(*_omrHooks)->J9HookUnregister(_omrHooks, J9HOOK_MM_OMR_INITIALIZED, generateVerbosegcEvent, NULL);276277if (extensions->isMetronomeGC()) {278disableVerboseGCRealtime();279} else {280disableVerboseGCNonRealtime();281}282283if (extensions->isVLHGC()) {284disableVerboseGCVLHGC();285}286287_hooksAttached = false;288_indentationLevel = 0;289}290}291292void293MM_VerboseManagerOld::enableVerboseGCRealtime()294{295#if defined(J9VM_GC_REALTIME)296/* These are the hooks metronome is interested in297* TODO: this is a hack - we need a pluggable way to define different verbosegc systems (eg j2se, metronome, gclite)298*/299(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_INCREMENT_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeGCStart::newInstance);300(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_INCREMENT_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeGCEnd::newInstance);301(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_SYNCHRONOUS_GC_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeSynchronousGCStart::newInstance);302(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_SYNCHRONOUS_GC_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeSynchronousGCEnd::newInstance);303(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_TRIGGER_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeTriggerStart::newInstance);304(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_TRIGGER_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeTriggerEnd::newInstance);305(*_omrHooks)->J9HookRegisterWithCallSite(_omrHooks, J9HOOK_MM_OMR_GC_CYCLE_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeCycleStart::newInstance);306(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_POST_CYCLE_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeCycleEnd::newInstance);307(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_OUT_OF_MEMORY, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeOutOfMemory::newInstance);308(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_UTILIZATION_TRACKER_OVERFLOW, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeUtilizationTrackerOverflow::newInstance);309(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_NON_MONOTONIC_TIME, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMetronomeNonMonotonicTime::newInstance);310(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventTarokIncrementStart::newInstance);311(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventTarokIncrementEnd::newInstance);312(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_ABORT, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventCopyForwardAbortRaised::newInstance);313#endif /* J9VM_GC_REALTIME */314}315316void317MM_VerboseManagerOld::disableVerboseGCRealtime()318{319#if defined(J9VM_GC_REALTIME)320/* Unregister metronome verbosegc hooks */321(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_INCREMENT_START, generateVerbosegcEvent, NULL);322(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_INCREMENT_END, generateVerbosegcEvent, NULL);323(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_SYNCHRONOUS_GC_START, generateVerbosegcEvent, NULL);324(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_SYNCHRONOUS_GC_END, generateVerbosegcEvent, NULL);325(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_TRIGGER_START, generateVerbosegcEvent, NULL);326(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_METRONOME_TRIGGER_END, generateVerbosegcEvent, NULL);327(*_omrHooks)->J9HookUnregister(_omrHooks, J9HOOK_MM_OMR_GC_CYCLE_START, generateVerbosegcEvent, NULL);328(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GC_POST_CYCLE_END, generateVerbosegcEvent, NULL);329(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_OUT_OF_MEMORY, generateVerbosegcEvent, NULL);330(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_UTILIZATION_TRACKER_OVERFLOW, generateVerbosegcEvent, NULL);331(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_NON_MONOTONIC_TIME, generateVerbosegcEvent, NULL);332(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_START, generateVerbosegcEvent, NULL);333(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_END, generateVerbosegcEvent, NULL);334(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_ABORT, generateVerbosegcEvent, NULL);335#endif /* J9VM_GC_REALTIME */336}337338void339MM_VerboseManagerOld::enableVerboseGCNonRealtime()340{341(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GLOBAL_GC_INCREMENT_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventGlobalGCStart::newInstance);342(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GLOBAL_GC_INCREMENT_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventGlobalGCEnd::newInstance);343344(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_MARK_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMarkStart::newInstance);345(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_MARK_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventMarkEnd::newInstance);346347(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SWEEP_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventSweepStart::newInstance);348(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SWEEP_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventSweepEnd::newInstance);349#if defined(J9VM_GC_MODRON_COMPACTION)350(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COMPACT_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventCompactStart::newInstance);351(*_omrHooks)->J9HookRegisterWithCallSite(_omrHooks, J9HOOK_MM_OMR_COMPACT_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventCompactEnd::newInstance);352#endif /* defined(J9VM_GC_MODRON_COMPACTION) */353#if defined(J9VM_GC_MODRON_SCAVENGER)354(*_omrHooks)->J9HookRegisterWithCallSite(_omrHooks, J9HOOK_MM_OMR_LOCAL_GC_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventLocalGCStart::newInstance);355(*_omrHooks)->J9HookRegisterWithCallSite(_omrHooks, J9HOOK_MM_OMR_LOCAL_GC_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventLocalGCEnd::newInstance);356#endif /* defined(J9VM_GC_MODRON_SCAVENGER) */357(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventSystemGCStart::newInstance);358(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventSystemGCEnd::newInstance);359360(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventAFStart::newInstance);361(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventAFEnd::newInstance);362363(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_HEAP_RESIZE, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventHeapResize::newInstance);364365(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_KICKOFF, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentKickOff::newInstance);366(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_ABORTED, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentAborted::newInstance);367(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_HALTED, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentHalted::newInstance);368(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COLLECTION_CARD_CLEANING_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentFinalCardCleaningStart::newInstance);369(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COLLECTION_CARD_CLEANING_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentFinalCardCleaningEnd::newInstance);370(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COMPLETE_TRACING_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentCompleteTracingStart::newInstance);371(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COMPLETE_TRACING_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentCompleteTracingEnd::newInstance);372(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_REMEMBERED_SET_SCAN_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentRSScanStart::newInstance);373(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_REMEMBERED_SET_SCAN_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentRSScanEnd::newInstance);374(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COLLECTION_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentStart::newInstance);375(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COLLECTION_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentEnd::newInstance);376377#if defined(J9VM_GC_CONCURRENT_SWEEP)378(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENTLY_COMPLETED_SWEEP_PHASE, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventConcurrentlyCompletedSweepPhase::newInstance);379(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COMPLETED_CONCURRENT_SWEEP, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventCompletedConcurrentSweep::newInstance);380#endif /* J9VM_GC_CONCURRENT_SWEEP */381382(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CLASS_UNLOADING_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventClassUnloadingStart::newInstance);383(*_mmHooks)->J9HookRegisterWithCallSite(_mmHooks, J9HOOK_MM_CLASS_UNLOADING_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventClassUnloadingEnd::newInstance);384385#if defined(J9VM_GC_MODRON_SCAVENGER)386(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PERCOLATE_COLLECT, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventPercolateCollect::newInstance);387#endif /* J9VM_GC_MODRON_SCAVENGER */388389(*_omrHooks)->J9HookRegisterWithCallSite(_omrHooks, J9HOOK_MM_OMR_EXCESSIVEGC_RAISED, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventExcessiveGCRaised::newInstance);390}391392void393MM_VerboseManagerOld::disableVerboseGCNonRealtime()394{395(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GLOBAL_GC_INCREMENT_START, generateVerbosegcEvent, NULL);396(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_GLOBAL_GC_INCREMENT_END, generateVerbosegcEvent, NULL);397398(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_MARK_START, generateVerbosegcEvent, NULL);399(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_MARK_END, generateVerbosegcEvent, NULL);400401(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SWEEP_START, generateVerbosegcEvent, NULL);402(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SWEEP_END, generateVerbosegcEvent, NULL);403#if defined(J9VM_GC_MODRON_COMPACTION)404(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COMPACT_START, generateVerbosegcEvent, NULL);405(*_omrHooks)->J9HookUnregister(_omrHooks, J9HOOK_MM_OMR_COMPACT_END, generateVerbosegcEvent, NULL);406#endif /* defined(J9VM_GC_MODRON_COMPACTION) */407#if defined(J9VM_GC_MODRON_SCAVENGER)408(*_omrHooks)->J9HookUnregister(_omrHooks, J9HOOK_MM_OMR_LOCAL_GC_START, generateVerbosegcEvent, NULL);409(*_omrHooks)->J9HookUnregister(_omrHooks, J9HOOK_MM_OMR_LOCAL_GC_END, generateVerbosegcEvent, NULL);410#endif /* defined(J9VM_GC_MODRON_SCAVENGER) */411(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_START, generateVerbosegcEvent, NULL);412(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_SYSTEM_GC_END, generateVerbosegcEvent, NULL);413414(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_START, generateVerbosegcEvent, NULL);415(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_ALLOCATION_FAILURE_END, generateVerbosegcEvent, NULL);416417(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_HEAP_RESIZE, generateVerbosegcEvent, NULL);418419(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_KICKOFF, generateVerbosegcEvent, NULL);420(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_ABORTED, generateVerbosegcEvent, NULL);421(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_HALTED, generateVerbosegcEvent, NULL);422(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COLLECTION_CARD_CLEANING_START, generateVerbosegcEvent, NULL);423(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COLLECTION_CARD_CLEANING_END, generateVerbosegcEvent, NULL);424(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COMPLETE_TRACING_START, generateVerbosegcEvent, NULL);425(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COMPLETE_TRACING_END, generateVerbosegcEvent, NULL);426(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_REMEMBERED_SET_SCAN_START, generateVerbosegcEvent, NULL);427(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_REMEMBERED_SET_SCAN_END, generateVerbosegcEvent, NULL);428(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COLLECTION_START, generateVerbosegcEvent, NULL);429(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENT_COLLECTION_END, generateVerbosegcEvent, NULL);430431#if defined(J9VM_GC_CONCURRENT_SWEEP)432(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CONCURRENTLY_COMPLETED_SWEEP_PHASE, generateVerbosegcEvent, NULL);433(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COMPLETED_CONCURRENT_SWEEP, generateVerbosegcEvent, NULL);434#endif /* J9VM_GC_CONCURRENT_SWEEP */435436(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_CLASS_UNLOADING_START, generateVerbosegcEvent, NULL);437(*_mmHooks)->J9HookUnregister(_mmHooks, J9HOOK_MM_CLASS_UNLOADING_END, generateVerbosegcEvent, NULL);438439#if defined(J9VM_GC_MODRON_SCAVENGER)440(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_PERCOLATE_COLLECT, generateVerbosegcEvent, NULL);441#endif /* J9VM_GC_MODRON_SCAVENGER */442443(*_omrHooks)->J9HookUnregister(_omrHooks, J9HOOK_MM_OMR_EXCESSIVEGC_RAISED, generateVerbosegcEvent, NULL);444}445446void447MM_VerboseManagerOld::enableVerboseGCVLHGC()448{449#if defined(J9VM_GC_VLHGC)450(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_START, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventTarokIncrementStart::newInstance);451(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_END, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventTarokIncrementEnd::newInstance);452(*_mmPrivateHooks)->J9HookRegisterWithCallSite(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_ABORT, generateVerbosegcEvent, OMR_GET_CALLSITE(), (void *)MM_VerboseEventCopyForwardAbortRaised::newInstance);453#endif /* defined(J9VM_GC_VLHGC) */454455}456457void458MM_VerboseManagerOld::disableVerboseGCVLHGC()459{460#if defined(J9VM_GC_VLHGC)461(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_START, generateVerbosegcEvent, NULL);462(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_TAROK_INCREMENT_END, generateVerbosegcEvent, NULL);463(*_mmPrivateHooks)->J9HookUnregister(_mmPrivateHooks, J9HOOK_MM_PRIVATE_COPY_FORWARD_ABORT, generateVerbosegcEvent, NULL);464#endif /* defined(J9VM_GC_VLHGC) */465}466467/**468* Finds an agent of a given type in the event chain.469* @param type Indicates the type of agent to return.470* @return Pointer to an agent of the specified type.471*/472MM_VerboseOutputAgent *473MM_VerboseManagerOld::findAgentInChain(AgentType type)474{475MM_VerboseOutputAgent *agent = _agentChain;476477while (agent){478if (type == agent->getType()){479return agent;480}481agent = agent->getNextAgent();482}483484return NULL;485}486487AgentType488MM_VerboseManagerOld::parseAgentType(MM_EnvironmentBase *env, char *filename, UDATA fileCount, UDATA iterations)489{490if(NULL == filename) {491return STANDARD_STREAM;492}493494if(!strcmp(filename, "stderr") || !strcmp(filename, "stdout")) {495return STANDARD_STREAM;496}497498if(!strcmp(filename, "trace")) {499return TRACE;500}501502if(!strcmp(filename, "hook")) {503return HOOK;504}505506return FILE_LOGGING;507}508509/**510* Counts the number of output agents currently enabled.511* @return the number of current output agents.512*/513UDATA514MM_VerboseManagerOld::countActiveOutputHandlers()515{516MM_VerboseOutputAgent *agent = _agentChain;517UDATA count = 0;518519while(agent) {520if(agent->isActive()) {521count += 1;522}523agent = agent->getNextAgent();524}525526return count;527}528529/**530* Walks the output agent chain disabling the agents.531*/532void533MM_VerboseManagerOld::disableAgents()534{535MM_VerboseOutputAgent *agent = _agentChain;536537while(agent) {538agent->isActive(false);539agent = agent->getNextAgent();540}541}542543/**544* Configures verbosegc according to the parameters passed.545* @param filename The name of the file or output stream to log to.546* @param fileCount The number of files to log to.547* @param iterations The number of gc cycles to log to each file.548* @return true on success, false on failure549*/550bool551MM_VerboseManagerOld::configureVerboseGC(OMR_VM *omrVM, char *filename, UDATA fileCount, UDATA iterations)552{553MM_EnvironmentBase env(omrVM);554555MM_VerboseOutputAgent *agent;556557disableAgents();558559AgentType type = parseAgentType(&env, filename, fileCount, iterations);560561agent = findAgentInChain(type);562if(NULL != agent) {563agent->reconfigure(&env, filename, fileCount, iterations);564} else {565switch(type) {566case STANDARD_STREAM:567agent = MM_VerboseStandardStreamOutput::newInstance(&env, filename);568break;569570case TRACE:571agent = MM_VerboseTraceOutput::newInstance(&env);572break;573574case FILE_LOGGING:575agent = MM_VerboseFileLoggingOutput::newInstance(&env, filename, fileCount, iterations);576if (NULL == agent) {577agent = findAgentInChain(STANDARD_STREAM);578if (NULL != agent) {579agent->isActive(true);580return true;581}582/* if we failed to create a file stream and there is no stderr agenttry to create a stderr agent */583agent = MM_VerboseStandardStreamOutput::newInstance(&env, NULL);584}585break;586587case HOOK:588/* The hook method is only available to new verbose */589return false;590591default:592return false;593}594595if(NULL == agent) {596return false;597}598599chainOutputAgent(agent);600}601602agent->isActive(true);603604return true;605}606607/**608* Passes the event stream to each output agent in the output agent chain.609*/610void611MM_VerboseManagerOld::passStreamToOutputAgents(MM_EnvironmentBase *env, MM_VerboseEventStream *stream)612{613MM_VerboseOutputAgent *agent = _agentChain;614615while(NULL != agent) {616if(agent->isActive()) {617agent->processEventStream(env, stream);618}619agent = agent->getNextAgent();620}621}622623624