GCThreadSharedData::GCThreadSharedData(VM* vm) : m_vm(vm) , m_copiedSpace(&vm->heap.m_storageSpace) , m_shouldHashCons(false) , m_sharedMarkStack() , m_numberOfActiveParallelMarkers(0) , m_parallelMarkersShouldExit(false) , m_copyIndex(0) , m_numberOfActiveGCThreads(0) , m_gcThreadsShouldWait(false) , m_currentPhase(NoPhase) { #if ENABLE(PARALLEL_GC) // Grab the lock so the new GC threads can be properly initialized before they start running. std::unique_lock<std::mutex> lock(m_phaseMutex); for (unsigned i = 1; i < Options::numberOfGCMarkers(); ++i) { m_numberOfActiveGCThreads++; SlotVisitor* slotVisitor = new SlotVisitor(*this); CopyVisitor* copyVisitor = new CopyVisitor(*this); GCThread* newThread = new GCThread(*this, slotVisitor, copyVisitor); ThreadIdentifier threadID = createThread(GCThread::gcThreadStartFunc, newThread, "JavaScriptCore::Marking"); newThread->initializeThreadID(threadID); m_gcThreads.append(newThread); } // Wait for all the GCThreads to get to the right place. m_activityConditionVariable.wait(lock, [this] { return !m_numberOfActiveGCThreads; }); #endif }
GCThreadSharedData::GCThreadSharedData(JSGlobalData* globalData) : m_globalData(globalData) , m_copiedSpace(&globalData->heap.m_storageSpace) , m_shouldHashConst(false) , m_sharedMarkStack(m_segmentAllocator) , m_numberOfActiveParallelMarkers(0) , m_parallelMarkersShouldExit(false) , m_blocksToCopy(globalData->heap.m_blockSnapshot) , m_copyIndex(0) , m_numberOfActiveGCThreads(0) , m_gcThreadsShouldWait(false) , m_currentPhase(NoPhase) { m_copyLock.Init(); #if ENABLE(PARALLEL_GC) // Grab the lock so the new GC threads can be properly initialized before they start running. MutexLocker locker(m_phaseLock); for (unsigned i = 1; i < Options::numberOfGCMarkers(); ++i) { m_numberOfActiveGCThreads++; SlotVisitor* slotVisitor = new SlotVisitor(*this); CopyVisitor* copyVisitor = new CopyVisitor(*this); GCThread* newThread = new GCThread(*this, slotVisitor, copyVisitor); ThreadIdentifier threadID = createThread(GCThread::gcThreadStartFunc, newThread, "JavaScriptCore::Marking"); newThread->initializeThreadID(threadID); m_gcThreads.append(newThread); } // Wait for all the GCThreads to get to the right place. while (m_numberOfActiveGCThreads) m_activityCondition.wait(m_phaseLock); #endif }
void GCThread::gcThreadStartFunc(void* data) { GCThread* thread = static_cast<GCThread*>(data); thread->gcThreadMain(); }