diff options
Diffstat (limited to 'Source/JavaScriptCore/heap/IncrementalSweeper.cpp')
| -rw-r--r-- | Source/JavaScriptCore/heap/IncrementalSweeper.cpp | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp index e0783d615..2852266aa 100644 --- a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp +++ b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp @@ -26,11 +26,12 @@ #include "config.h" #include "IncrementalSweeper.h" +#include "APIShims.h" +#include "DelayedReleaseScope.h" #include "Heap.h" #include "JSObject.h" #include "JSString.h" #include "MarkedBlock.h" -#include "JSCInlines.h" #include <wtf/HashSet.h> #include <wtf/WTFThreadData.h> @@ -45,10 +46,16 @@ static const double sweepTimeMultiplier = 1.0 / sweepTimeTotal; IncrementalSweeper::IncrementalSweeper(Heap* heap, CFRunLoopRef runLoop) : HeapTimer(heap->vm(), runLoop) + , m_currentBlockToSweepIndex(0) , m_blocksToSweep(heap->m_blockSnapshot) { } +PassOwnPtr<IncrementalSweeper> IncrementalSweeper::create(Heap* heap) +{ + return adoptPtr(new IncrementalSweeper(heap, CFRunLoopGetCurrent())); +} + void IncrementalSweeper::scheduleTimer() { CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + (sweepTimeSlice * sweepTimeMultiplier)); @@ -66,7 +73,10 @@ void IncrementalSweeper::doWork() void IncrementalSweeper::doSweep(double sweepBeginTime) { - while (sweepNextBlock()) { + DelayedReleaseScope scope(m_vm->heap.m_objectSpace); + while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { + sweepNextBlock(); + double elapsedTime = WTF::monotonicallyIncreasingTime() - sweepBeginTime; if (elapsedTime < sweepTimeSlice) continue; @@ -79,30 +89,30 @@ void IncrementalSweeper::doSweep(double sweepBeginTime) cancelTimer(); } -bool IncrementalSweeper::sweepNextBlock() +void IncrementalSweeper::sweepNextBlock() { - while (!m_blocksToSweep.isEmpty()) { - MarkedBlock* block = m_blocksToSweep.takeLast(); + while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { + MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++]; if (!block->needsSweeping()) continue; - DeferGCForAWhile deferGC(m_vm->heap); block->sweep(); m_vm->heap.objectSpace().freeOrShrinkBlock(block); - return true; + return; } - - return m_vm->heap.sweepNextLogicallyEmptyWeakBlock(); } -void IncrementalSweeper::startSweeping() +void IncrementalSweeper::startSweeping(Vector<MarkedBlock*>& blockSnapshot) { + m_blocksToSweep = blockSnapshot; + m_currentBlockToSweepIndex = 0; scheduleTimer(); } void IncrementalSweeper::willFinishSweeping() { + m_currentBlockToSweepIndex = 0; m_blocksToSweep.clear(); if (m_vm) cancelTimer(); @@ -119,7 +129,12 @@ void IncrementalSweeper::doWork() { } -void IncrementalSweeper::startSweeping() +PassOwnPtr<IncrementalSweeper> IncrementalSweeper::create(Heap* heap) +{ + return adoptPtr(new IncrementalSweeper(heap->vm())); +} + +void IncrementalSweeper::startSweeping(Vector<MarkedBlock*>&) { } @@ -127,9 +142,8 @@ void IncrementalSweeper::willFinishSweeping() { } -bool IncrementalSweeper::sweepNextBlock() +void IncrementalSweeper::sweepNextBlock() { - return false; } #endif |
