BlockAllocator::~BlockAllocator() { releaseFreeBlocks(); { MutexLocker locker(m_freeBlockLock); m_blockFreeingThreadShouldQuit = true; m_freeBlockCondition.broadcast(); } waitForThreadCompletion(m_blockFreeingThread); }
void Heap::destroy() { JSLock lock(SilenceAssertionsOnly); if (!m_globalData) return; ASSERT(!m_globalData->dynamicGlobalObject); ASSERT(m_operationInProgress == NoOperation); // The global object is not GC protected at this point, so sweeping may delete it // (and thus the global data) before other objects that may use the global data. RefPtr<JSGlobalData> protect(m_globalData); #if ENABLE(JIT) m_globalData->jitStubs->clearHostFunctionStubs(); #endif delete m_markListSet; m_markListSet = 0; canonicalizeCellLivenessData(); clearMarks(); m_handleHeap.finalizeWeakHandles(); m_globalData->smallStrings.finalizeSmallStrings(); shrink(); ASSERT(!size()); #if ENABLE(SIMPLE_HEAP_PROFILING) m_slotVisitor.m_visitedTypeCounts.dump(stderr, "Visited Type Counts"); m_destroyedTypeCounts.dump(stderr, "Destroyed Type Counts"); #endif releaseFreeBlocks(); m_globalData = 0; }