void MM_MasterGCThread::masterThreadEntryPoint() { OMR_VMThread *omrVMThread = NULL; Assert_MM_true(NULL != _collectorControlMutex); Assert_MM_true(NULL == _masterGCThread); /* Attach the thread as a system daemon thread */ /* You need a VM thread so that the stack walker can work */ omrVMThread = MM_EnvironmentBase::attachVMThread(_extensions->getOmrVM(), "Dedicated GC Master", MM_EnvironmentBase::ATTACH_GC_MASTER_THREAD); if (NULL == omrVMThread) { /* we failed to attach so notify the creating thread that we should fail to start up */ omrthread_monitor_enter(_collectorControlMutex); _masterThreadState = STATE_ERROR; omrthread_monitor_notify(_collectorControlMutex); omrthread_exit(_collectorControlMutex); } else { /* thread attached successfully */ MM_EnvironmentBase *env = MM_EnvironmentBase::getEnvironment(omrVMThread); /* attachVMThread could allocate an execute a barrier (since it that point, this thread acted as a mutator thread. * Flush GC chaches (like barrier buffers) before turning into the master thread */ env->flushGCCaches(); env->setThreadType(GC_MASTER_THREAD); /* Begin running the thread */ omrthread_monitor_enter(_collectorControlMutex); _collector->preMasterGCThreadInitialize(env); _masterThreadState = STATE_WAITING; _masterGCThread = omrthread_self(); omrthread_monitor_notify(_collectorControlMutex); do { if (STATE_GC_REQUESTED == _masterThreadState) { if (_runAsImplicit) { handleConcurrent(env); } else { handleSTW(env); } } if (STATE_WAITING == _masterThreadState) { if (_runAsImplicit || !handleConcurrent(env)) { omrthread_monitor_wait(_collectorControlMutex); } } } while (STATE_TERMINATION_REQUESTED != _masterThreadState); /* notify the other side that we are active so that they can continue running */ _masterThreadState = STATE_TERMINATED; _masterGCThread = NULL; omrthread_monitor_notify(_collectorControlMutex); MM_EnvironmentBase::detachVMThread(_extensions->getOmrVM(), omrVMThread, MM_EnvironmentBase::ATTACH_GC_MASTER_THREAD); omrthread_exit(_collectorControlMutex); } }