X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/93a3786624b2768d89bfa27e46598dc64e2fb70a..refs/heads/master:/heap/IncrementalSweeper.cpp diff --git a/heap/IncrementalSweeper.cpp b/heap/IncrementalSweeper.cpp index 038432a..e0783d6 100644 --- a/heap/IncrementalSweeper.cpp +++ b/heap/IncrementalSweeper.cpp @@ -26,37 +26,29 @@ #include "config.h" #include "IncrementalSweeper.h" -#include "APIShims.h" #include "Heap.h" #include "JSObject.h" #include "JSString.h" #include "MarkedBlock.h" +#include "JSCInlines.h" #include #include namespace JSC { -#if USE(CF) || PLATFORM(BLACKBERRY) || PLATFORM(QT) +#if USE(CF) static const double sweepTimeSlice = .01; // seconds static const double sweepTimeTotal = .10; static const double sweepTimeMultiplier = 1.0 / sweepTimeTotal; -#if USE(CF) - IncrementalSweeper::IncrementalSweeper(Heap* heap, CFRunLoopRef runLoop) : HeapTimer(heap->vm(), runLoop) - , m_currentBlockToSweepIndex(0) , m_blocksToSweep(heap->m_blockSnapshot) { } -PassOwnPtr IncrementalSweeper::create(Heap* heap) -{ - return adoptPtr(new IncrementalSweeper(heap, CFRunLoopGetCurrent())); -} - void IncrementalSweeper::scheduleTimer() { CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + (sweepTimeSlice * sweepTimeMultiplier)); @@ -67,36 +59,6 @@ void IncrementalSweeper::cancelTimer() CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + s_decade); } -#elif PLATFORM(BLACKBERRY) || PLATFORM(QT) - -IncrementalSweeper::IncrementalSweeper(Heap* heap) - : HeapTimer(heap->vm()) - , m_currentBlockToSweepIndex(0) - , m_blocksToSweep(heap->m_blockSnapshot) -{ -} - -PassOwnPtr IncrementalSweeper::create(Heap* heap) -{ - return adoptPtr(new IncrementalSweeper(heap)); -} - -void IncrementalSweeper::scheduleTimer() -{ -#if PLATFORM(QT) - m_timer.start(sweepTimeSlice * sweepTimeMultiplier * 1000, this); -#else - m_timer.start(sweepTimeSlice * sweepTimeMultiplier); -#endif -} - -void IncrementalSweeper::cancelTimer() -{ - m_timer.stop(); -} - -#endif - void IncrementalSweeper::doWork() { doSweep(WTF::monotonicallyIncreasingTime()); @@ -104,9 +66,7 @@ void IncrementalSweeper::doWork() void IncrementalSweeper::doSweep(double sweepBeginTime) { - while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { - sweepNextBlock(); - + while (sweepNextBlock()) { double elapsedTime = WTF::monotonicallyIncreasingTime() - sweepBeginTime; if (elapsedTime < sweepTimeSlice) continue; @@ -119,30 +79,30 @@ void IncrementalSweeper::doSweep(double sweepBeginTime) cancelTimer(); } -void IncrementalSweeper::sweepNextBlock() +bool IncrementalSweeper::sweepNextBlock() { - while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { - MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++]; + while (!m_blocksToSweep.isEmpty()) { + MarkedBlock* block = m_blocksToSweep.takeLast(); if (!block->needsSweeping()) continue; + DeferGCForAWhile deferGC(m_vm->heap); block->sweep(); m_vm->heap.objectSpace().freeOrShrinkBlock(block); - return; + return true; } + + return m_vm->heap.sweepNextLogicallyEmptyWeakBlock(); } -void IncrementalSweeper::startSweeping(Vector& blockSnapshot) +void IncrementalSweeper::startSweeping() { - m_blocksToSweep = blockSnapshot; - m_currentBlockToSweepIndex = 0; scheduleTimer(); } void IncrementalSweeper::willFinishSweeping() { - m_currentBlockToSweepIndex = 0; m_blocksToSweep.clear(); if (m_vm) cancelTimer(); @@ -159,12 +119,7 @@ void IncrementalSweeper::doWork() { } -PassOwnPtr IncrementalSweeper::create(Heap* heap) -{ - return adoptPtr(new IncrementalSweeper(heap->vm())); -} - -void IncrementalSweeper::startSweeping(Vector&) +void IncrementalSweeper::startSweeping() { } @@ -172,8 +127,9 @@ void IncrementalSweeper::willFinishSweeping() { } -void IncrementalSweeper::sweepNextBlock() +bool IncrementalSweeper::sweepNextBlock() { + return false; } #endif