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::shrink() { WeakBlock* next; for (WeakBlock* block = m_blocks.head(); block; block = next) { next = block->next(); if (block->isEmpty()) removeAllocator(block); } resetAllocator(); if (m_blocks.isEmpty() && isOnList()) remove(); }
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; }