diff options
Diffstat (limited to 'Source/JavaScriptCore/heap/MarkedAllocator.cpp')
-rw-r--r-- | Source/JavaScriptCore/heap/MarkedAllocator.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/Source/JavaScriptCore/heap/MarkedAllocator.cpp b/Source/JavaScriptCore/heap/MarkedAllocator.cpp index 465e3a72a..20b556969 100644 --- a/Source/JavaScriptCore/heap/MarkedAllocator.cpp +++ b/Source/JavaScriptCore/heap/MarkedAllocator.cpp @@ -3,6 +3,7 @@ #include "GCActivityCallback.h" #include "Heap.h" +#include "IncrementalSweeper.h" #include "JSGlobalData.h" #include <wtf/CurrentTime.h> @@ -11,7 +12,7 @@ namespace JSC { bool MarkedAllocator::isPagedOut(double deadline) { unsigned itersSinceLastTimeCheck = 0; - HeapBlock* block = m_blockList.head(); + MarkedBlock* block = m_blockList.head(); while (block) { block = block->next(); ++itersSinceLastTimeCheck; @@ -29,7 +30,18 @@ bool MarkedAllocator::isPagedOut(double deadline) inline void* MarkedAllocator::tryAllocateHelper() { if (!m_freeList.head) { - for (MarkedBlock*& block = m_blocksToSweep; block; block = static_cast<MarkedBlock*>(block->next())) { + if (m_onlyContainsStructures && !m_heap->isSafeToSweepStructures()) { + if (m_currentBlock) { + m_currentBlock->didConsumeFreeList(); + m_currentBlock = 0; + } + // We sweep another random block here so that we can make progress + // toward being able to sweep Structures. + m_heap->sweeper()->sweepNextBlock(); + return 0; + } + + for (MarkedBlock*& block = m_blocksToSweep; block; block = block->next()) { m_freeList = block->sweep(MarkedBlock::SweepToFreeList); if (m_freeList.head) { m_currentBlock = block; @@ -104,7 +116,6 @@ MarkedBlock* MarkedAllocator::allocateBlock() void MarkedAllocator::addBlock(MarkedBlock* block) { ASSERT(!m_currentBlock); - ASSERT(!m_blocksToSweep); ASSERT(!m_freeList.head); m_blockList.append(block); @@ -115,11 +126,11 @@ void MarkedAllocator::addBlock(MarkedBlock* block) void MarkedAllocator::removeBlock(MarkedBlock* block) { if (m_currentBlock == block) { - m_currentBlock = static_cast<MarkedBlock*>(m_currentBlock->next()); + m_currentBlock = m_currentBlock->next(); m_freeList = MarkedBlock::FreeList(); } if (m_blocksToSweep == block) - m_blocksToSweep = static_cast<MarkedBlock*>(m_blocksToSweep->next()); + m_blocksToSweep = m_blocksToSweep->next(); m_blockList.remove(block); } |