diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/heap/IncrementalSweeper.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/heap/IncrementalSweeper.cpp')
-rw-r--r-- | Source/JavaScriptCore/heap/IncrementalSweeper.cpp | 100 |
1 files changed, 28 insertions, 72 deletions
diff --git a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp index 2852266aa..cfe89b870 100644 --- a/Source/JavaScriptCore/heap/IncrementalSweeper.cpp +++ b/Source/JavaScriptCore/heap/IncrementalSweeper.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Apple Inc. All rights reserved. + * Copyright (C) 2012, 2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,44 +26,28 @@ #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 <wtf/HashSet.h> -#include <wtf/WTFThreadData.h> +#include "JSCInlines.h" +#include <wtf/CurrentTime.h> namespace JSC { -#if USE(CF) - static const double sweepTimeSlice = .01; // seconds static const double sweepTimeTotal = .10; 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)); + HeapTimer::scheduleTimer(sweepTimeSlice * sweepTimeMultiplier); } -void IncrementalSweeper::cancelTimer() +IncrementalSweeper::IncrementalSweeper(Heap* heap) + : HeapTimer(heap->vm()) + , m_currentAllocator(nullptr) { - CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + s_decade); } void IncrementalSweeper::doWork() @@ -73,10 +57,7 @@ void IncrementalSweeper::doWork() void IncrementalSweeper::doSweep(double sweepBeginTime) { - DelayedReleaseScope scope(m_vm->heap.m_objectSpace); - while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { - sweepNextBlock(); - + while (sweepNextBlock()) { double elapsedTime = WTF::monotonicallyIncreasingTime() - sweepBeginTime; if (elapsedTime < sweepTimeSlice) continue; @@ -85,67 +66,42 @@ void IncrementalSweeper::doSweep(double sweepBeginTime) return; } - m_blocksToSweep.clear(); cancelTimer(); } -void IncrementalSweeper::sweepNextBlock() +bool IncrementalSweeper::sweepNextBlock() { - while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { - MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++]; - - if (!block->needsSweeping()) - continue; - + m_vm->heap.stopIfNecessary(); + + MarkedBlock::Handle* block = nullptr; + + for (; m_currentAllocator; m_currentAllocator = m_currentAllocator->nextAllocator()) { + block = m_currentAllocator->findBlockToSweep(); + if (block) + break; + } + + if (block) { + 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<MarkedBlock*>& blockSnapshot) +void IncrementalSweeper::startSweeping() { - m_blocksToSweep = blockSnapshot; - m_currentBlockToSweepIndex = 0; scheduleTimer(); + m_currentAllocator = m_vm->heap.objectSpace().firstAllocator(); } -void IncrementalSweeper::willFinishSweeping() +void IncrementalSweeper::stopSweeping() { - m_currentBlockToSweepIndex = 0; - m_blocksToSweep.clear(); + m_currentAllocator = nullptr; if (m_vm) cancelTimer(); } -#else - -IncrementalSweeper::IncrementalSweeper(VM* vm) - : HeapTimer(vm) -{ -} - -void IncrementalSweeper::doWork() -{ -} - -PassOwnPtr<IncrementalSweeper> IncrementalSweeper::create(Heap* heap) -{ - return adoptPtr(new IncrementalSweeper(heap->vm())); -} - -void IncrementalSweeper::startSweeping(Vector<MarkedBlock*>&) -{ -} - -void IncrementalSweeper::willFinishSweeping() -{ -} - -void IncrementalSweeper::sweepNextBlock() -{ -} - -#endif - } // namespace JSC |