summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/heap/IncrementalSweeper.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/heap/IncrementalSweeper.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/heap/IncrementalSweeper.cpp')
-rw-r--r--Source/JavaScriptCore/heap/IncrementalSweeper.cpp100
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