diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-08-12 09:27:39 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-08-12 09:27:39 +0200 |
commit | 3749d61e1f7a59f5ec5067e560af1eb610c82015 (patch) | |
tree | 73dc228333948738bbe02976cacca8cd382bc978 /Source/JavaScriptCore/heap/IncrementalSweeper.cpp | |
parent | b32b4dcd9a51ab8de6afc53d9e17f8707e1f7a5e (diff) | |
download | qtwebkit-3749d61e1f7a59f5ec5067e560af1eb610c82015.tar.gz |
Imported WebKit commit a77350243e054f3460d1137301d8b3faee3d2052 (http://svn.webkit.org/repository/webkit/trunk@125365)
New snapshot with build fixes for latest API changes in Qt and all WK1 Win MSVC fixes upstream
Diffstat (limited to 'Source/JavaScriptCore/heap/IncrementalSweeper.cpp')
-rw-r--r-- | Source/JavaScriptCore/heap/IncrementalSweeper.cpp | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp index 49222c545..f284d8b57 100644 --- a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp +++ b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp @@ -51,6 +51,7 @@ void IncrementalSweeper::doWork() IncrementalSweeper::IncrementalSweeper(Heap* heap, CFRunLoopRef runLoop) : HeapTimer(heap->globalData(), runLoop) , m_currentBlockToSweepIndex(0) + , m_structuresCanBeSwept(false) { } @@ -72,12 +73,7 @@ void IncrementalSweeper::cancelTimer() void IncrementalSweeper::doSweep(double sweepBeginTime) { while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { - MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++]; - if (!block->needsSweeping()) - continue; - - block->sweep(); - m_globalData->heap.objectSpace().freeOrShrinkBlock(block); + sweepNextBlock(); CFTimeInterval elapsedTime = WTF::monotonicallyIncreasingTime() - sweepBeginTime; if (elapsedTime < sweepTimeSlice) @@ -91,17 +87,48 @@ void IncrementalSweeper::doSweep(double sweepBeginTime) cancelTimer(); } +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 IncrementalSweeper::startSweeping(const HashSet<MarkedBlock*>& blockSnapshot) { - WTF::copyToVector(blockSnapshot, m_blocksToSweep); + m_blocksToSweep.resize(blockSnapshot.size()); + CopyFunctor functor(m_blocksToSweep); + m_globalData->heap.objectSpace().forEachBlock(functor); m_currentBlockToSweepIndex = 0; + m_structuresCanBeSwept = false; scheduleTimer(); } +void IncrementalSweeper::willFinishSweeping() +{ + m_currentBlockToSweepIndex = 0; + m_structuresCanBeSwept = true; + m_blocksToSweep.clear(); + if (m_globalData) + cancelTimer(); +} + #else IncrementalSweeper::IncrementalSweeper(JSGlobalData* globalData) : HeapTimer(globalData) + , m_structuresCanBeSwept(false) { } @@ -116,8 +143,23 @@ IncrementalSweeper* IncrementalSweeper::create(Heap* heap) void IncrementalSweeper::startSweeping(const HashSet<MarkedBlock*>&) { + m_structuresCanBeSwept = false; } - + +void IncrementalSweeper::willFinishSweeping() +{ + m_structuresCanBeSwept = true; +} + +void IncrementalSweeper::sweepNextBlock() +{ +} + #endif +bool IncrementalSweeper::structuresCanBeSwept() +{ + return m_structuresCanBeSwept; +} + } // namespace JSC |