diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/heap/IncrementalSweeper.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/heap/IncrementalSweeper.cpp')
-rw-r--r-- | Source/JavaScriptCore/heap/IncrementalSweeper.cpp | 93 |
1 files changed, 29 insertions, 64 deletions
diff --git a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp index 54f616728..2852266aa 100644 --- a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp +++ b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp @@ -26,87 +26,45 @@ #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> -#if PLATFORM(EFL) -#include <Ecore.h> -#include <wtf/CurrentTime.h> -#elif USE(GLIB) -#include <glib.h> -#endif - namespace JSC { -#if USE(CF) || PLATFORM(EFL) || USE(GLIB) +#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) { } -void IncrementalSweeper::scheduleTimer() -{ - CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + (sweepTimeSlice * sweepTimeMultiplier)); -} - -void IncrementalSweeper::cancelTimer() -{ - CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + s_decade); -} -#elif PLATFORM(EFL) -IncrementalSweeper::IncrementalSweeper(Heap* heap) - : HeapTimer(heap->vm()) - , m_blocksToSweep(heap->m_blockSnapshot) +PassOwnPtr<IncrementalSweeper> IncrementalSweeper::create(Heap* heap) { + return adoptPtr(new IncrementalSweeper(heap, CFRunLoopGetCurrent())); } void IncrementalSweeper::scheduleTimer() { - if (ecore_timer_freeze_get(m_timer)) - ecore_timer_thaw(m_timer); - - double targetTime = currentTime() + (sweepTimeSlice * sweepTimeMultiplier); - ecore_timer_interval_set(m_timer, targetTime); -} - -void IncrementalSweeper::cancelTimer() -{ - ecore_timer_freeze(m_timer); -} -#elif USE(GLIB) -IncrementalSweeper::IncrementalSweeper(Heap* heap) - : HeapTimer(heap->vm()) - , m_blocksToSweep(heap->m_blockSnapshot) -{ -} - -void IncrementalSweeper::scheduleTimer() -{ - auto delayDuration = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::duration<double>(sweepTimeSlice * sweepTimeMultiplier)); - gint64 currentTime = g_get_monotonic_time(); - gint64 targetTime = currentTime + std::min<gint64>(G_MAXINT64 - currentTime, delayDuration.count()); - ASSERT(targetTime >= currentTime); - g_source_set_ready_time(m_timer.get(), targetTime); + CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + (sweepTimeSlice * sweepTimeMultiplier)); } void IncrementalSweeper::cancelTimer() { - g_source_set_ready_time(m_timer.get(), -1); + CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + s_decade); } -#endif void IncrementalSweeper::doWork() { @@ -115,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; @@ -128,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(); @@ -159,8 +120,8 @@ void IncrementalSweeper::willFinishSweeping() #else -IncrementalSweeper::IncrementalSweeper(Heap* heap) - : HeapTimer(heap->vm()) +IncrementalSweeper::IncrementalSweeper(VM* vm) + : HeapTimer(vm) { } @@ -168,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*>&) { } @@ -176,9 +142,8 @@ void IncrementalSweeper::willFinishSweeping() { } -bool IncrementalSweeper::sweepNextBlock() +void IncrementalSweeper::sweepNextBlock() { - return false; } #endif |