void BlockDirectory::endMarking() { m_allocated.clearAll(); // It's surprising and frustrating to comprehend, but the end-of-marking flip does not need to // know what kind of collection it is. That knowledge is already encoded in the m_markingXYZ // vectors. if (!Options::tradeDestructorBlocks() && needsDestruction()) { ASSERT(m_empty.isEmpty()); m_canAllocateButNotEmpty = m_live & ~m_markingRetired; } else { m_empty = m_live & ~m_markingNotEmpty; m_canAllocateButNotEmpty = m_live & m_markingNotEmpty & ~m_markingRetired; } if (needsDestruction()) { // There are some blocks that we didn't allocate out of in the last cycle, but we swept them. This // will forget that we did that and we will end up sweeping them again and attempting to call their // destructors again. That's fine because of zapping. The only time when we cannot forget is when // we just allocate a block or when we move a block from one size class to another. That doesn't // happen here. m_destructible = m_live; } if (false) { dataLog("Bits for ", m_cellSize, ", ", m_attributes, " after endMarking:\n"); dumpBits(WTF::dataFile()); } }
void MarkedAllocator::endMarking() { m_allocated.clearAll(); // It's surprising and frustrating to comprehend, but the end-of-marking flip does not need to // know what kind of collection it is. That knowledge is already encoded in the m_markingXYZ // vectors. if (needsDestruction()) { // If blocks need destruction then nothing is empty! This is a correct assertion but may // become wrong once we go full concurrent: when we create a new block, it will flicker // into the empty set for a tiny moment. On the other hand, this code is likely to be run // in stopTheWorld. ASSERT(m_empty.isEmpty()); m_canAllocateButNotEmpty = m_live & ~m_markingRetired; return; } m_empty = m_live & ~m_markingNotEmpty; m_canAllocateButNotEmpty = m_live & m_markingNotEmpty & ~m_markingRetired; if (false) { dataLog("Bits for ", m_cellSize, ", ", m_attributes, " after endMarking:\n"); dumpBits(WTF::dataFile()); } }
void BlockDirectory::assertNoUnswept() { if (ASSERT_DISABLED) return; if (m_unswept.isEmpty()) return; dataLog("Assertion failed: unswept not empty in ", *this, ".\n"); dumpBits(); ASSERT_NOT_REACHED(); }