inline void ConservativeRoots::genericAddPointer(void* p, TinyBloomFilter filter, MarkHook& markHook) { markHook.mark(p); m_copiedSpace->pinIfNecessary(p); MarkedBlock* candidate = MarkedBlock::blockFor(p); if (filter.ruleOut(reinterpret_cast<Bits>(candidate))) { ASSERT(!candidate || !m_blocks->set().contains(candidate)); return; } if (!MarkedBlock::isAtomAligned(p)) return; if (!m_blocks->set().contains(candidate)) return; if (!candidate->isLiveCell(p)) return; if (m_size == m_capacity) grow(); m_roots[m_size++] = static_cast<JSCell*>(p); }
void Heap::freeBlocks(MarkedBlock* head) { MarkedBlock* next; for (MarkedBlock* block = head; block; block = next) { next = block->next(); m_blocks.remove(block); MarkedBlock::destroy(block); } }
void MarkedSpace::freeBlocks(DoublyLinkedList<MarkedBlock>& blocks) { MarkedBlock* next; for (MarkedBlock* block = blocks.head(); block; block = next) { next = block->next(); blocks.remove(block); m_blocks.remove(block); MarkedBlock::destroy(block); } }
void MarkedSpace::freeBlocks(MarkedBlock* head) { MarkedBlock* next; for (MarkedBlock* block = head; block; block = next) { next = static_cast<MarkedBlock*>(block->next()); m_blocks.remove(block); block->sweep(); MutexLocker locker(m_heap->m_freeBlockLock); m_heap->m_freeBlocks.append(block); m_heap->m_numberOfFreeBlocks++; } }
void IncrementalSweeper::sweepNextBlock() { while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++]; if (!block->needsSweeping()) continue; block->sweep(); m_globalData->heap.objectSpace().freeOrShrinkBlock(block); return; } }
static bool isListPagedOut(double deadline, DoublyLinkedList<MarkedBlock>& list) { unsigned itersSinceLastTimeCheck = 0; MarkedBlock* block = list.head(); while (block) { block = block->next(); ++itersSinceLastTimeCheck; if (itersSinceLastTimeCheck >= Heap::s_timeCheckResolution) { double currentTime = WTF::monotonicallyIncreasingTime(); if (currentTime > deadline) return true; itersSinceLastTimeCheck = 0; } } return false; }
bool MarkedAllocator::isPagedOut(double deadline) { unsigned itersSinceLastTimeCheck = 0; MarkedBlock* block = m_blockList.head(); while (block) { block = block->next(); ++itersSinceLastTimeCheck; if (itersSinceLastTimeCheck >= Heap::s_timeCheckResolution) { double currentTime = WTF::monotonicallyIncreasingTime(); if (currentTime > deadline) return true; itersSinceLastTimeCheck = 0; } } return false; }
void IncrementalSweeper::sweepNextBlock() { while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++]; if (block->onlyContainsStructures()) m_structuresCanBeSwept = true; else ASSERT(!m_structuresCanBeSwept); if (!block->needsSweeping()) continue; block->sweep(); m_globalData->heap.objectSpace().freeOrShrinkBlock(block); return; } }
void MarkedSpace::shrink() { // We record a temporary list of empties to avoid modifying m_blocks while iterating it. DoublyLinkedList<MarkedBlock> empties; BlockIterator end = m_blocks.end(); for (BlockIterator it = m_blocks.begin(); it != end; ++it) { MarkedBlock* block = *it; if (block->isEmpty()) { SizeClass& sizeClass = sizeClassFor(block->cellSize()); sizeClass.blockList.remove(block); sizeClass.nextBlock = sizeClass.blockList.head(); empties.append(block); } } freeBlocks(empties); ASSERT(empties.isEmpty()); }