void WeakSet::sweep() { for (WeakBlock* block = m_blocks.head(); block; block = block->next()) block->sweep(); resetAllocator(); }
WeakBlock::FreeCell* WeakSet::tryFindAllocator() { while (m_nextAllocator) { WeakBlock* block = m_nextAllocator; m_nextAllocator = m_nextAllocator->next(); block->sweep(); WeakBlock::SweepResult sweepResult = block->takeSweepResult(); if (sweepResult.freeList) return sweepResult.freeList; } return 0; }
void WeakSet::sweep() { WeakBlock* next; for (WeakBlock* block = m_blocks.head(); block; block = next) { next = block->next(); // If a block is completely empty, a new sweep won't have any effect. if (block->isEmpty()) continue; block->takeSweepResult(); // Force a new sweep by discarding the last sweep. block->sweep(); } }
void WeakSet::sweep() { for (WeakBlock* block = m_blocks.head(); block;) { heap()->sweepNextLogicallyEmptyWeakBlock(); WeakBlock* nextBlock = block->next(); block->sweep(); if (block->isLogicallyEmptyButNotFree()) { // If this WeakBlock is logically empty, but still has Weaks pointing into it, // we can't destroy it just yet. Detach it from the WeakSet and hand ownership // to the Heap so we don't pin down the entire MarkedBlock or LargeAllocation. m_blocks.remove(block); heap()->addLogicallyEmptyWeakBlock(block); block->disconnectContainer(); } block = nextBlock; } resetAllocator(); }
bool Heap::sweepNextLogicallyEmptyWeakBlock() { if (m_indexOfNextLogicallyEmptyWeakBlockToSweep == WTF::notFound) return false; WeakBlock* block = m_logicallyEmptyWeakBlocks[m_indexOfNextLogicallyEmptyWeakBlockToSweep]; block->sweep(); if (block->isEmpty()) { std::swap(m_logicallyEmptyWeakBlocks[m_indexOfNextLogicallyEmptyWeakBlockToSweep], m_logicallyEmptyWeakBlocks.last()); m_logicallyEmptyWeakBlocks.removeLast(); WeakBlock::destroy(block); } else m_indexOfNextLogicallyEmptyWeakBlockToSweep++; if (m_indexOfNextLogicallyEmptyWeakBlockToSweep >= m_logicallyEmptyWeakBlocks.size()) { m_indexOfNextLogicallyEmptyWeakBlockToSweep = WTF::notFound; return false; } return true; }