2 * Copyright (C) 2012 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "IncrementalSweeper.h"
29 #include "DelayedReleaseScope.h"
33 #include "MarkedBlock.h"
34 #include "JSCInlines.h"
36 #include <wtf/HashSet.h>
37 #include <wtf/WTFThreadData.h>
43 static const double sweepTimeSlice
= .01; // seconds
44 static const double sweepTimeTotal
= .10;
45 static const double sweepTimeMultiplier
= 1.0 / sweepTimeTotal
;
47 IncrementalSweeper::IncrementalSweeper(Heap
* heap
, CFRunLoopRef runLoop
)
48 : HeapTimer(heap
->vm(), runLoop
)
49 , m_currentBlockToSweepIndex(0)
50 , m_blocksToSweep(heap
->m_blockSnapshot
)
54 PassOwnPtr
<IncrementalSweeper
> IncrementalSweeper::create(Heap
* heap
)
56 return adoptPtr(new IncrementalSweeper(heap
, CFRunLoopGetCurrent()));
59 void IncrementalSweeper::scheduleTimer()
61 CFRunLoopTimerSetNextFireDate(m_timer
.get(), CFAbsoluteTimeGetCurrent() + (sweepTimeSlice
* sweepTimeMultiplier
));
64 void IncrementalSweeper::cancelTimer()
66 CFRunLoopTimerSetNextFireDate(m_timer
.get(), CFAbsoluteTimeGetCurrent() + s_decade
);
69 void IncrementalSweeper::doWork()
71 doSweep(WTF::monotonicallyIncreasingTime());
74 void IncrementalSweeper::doSweep(double sweepBeginTime
)
76 DelayedReleaseScope
scope(m_vm
->heap
.m_objectSpace
);
77 while (m_currentBlockToSweepIndex
< m_blocksToSweep
.size()) {
80 double elapsedTime
= WTF::monotonicallyIncreasingTime() - sweepBeginTime
;
81 if (elapsedTime
< sweepTimeSlice
)
88 m_blocksToSweep
.clear();
92 void IncrementalSweeper::sweepNextBlock()
94 while (m_currentBlockToSweepIndex
< m_blocksToSweep
.size()) {
95 MarkedBlock
* block
= m_blocksToSweep
[m_currentBlockToSweepIndex
++];
97 if (!block
->needsSweeping())
101 m_vm
->heap
.objectSpace().freeOrShrinkBlock(block
);
106 void IncrementalSweeper::startSweeping(Vector
<MarkedBlock
*>& blockSnapshot
)
108 m_blocksToSweep
= blockSnapshot
;
109 m_currentBlockToSweepIndex
= 0;
113 void IncrementalSweeper::willFinishSweeping()
115 m_currentBlockToSweepIndex
= 0;
116 m_blocksToSweep
.clear();
123 IncrementalSweeper::IncrementalSweeper(VM
* vm
)
128 void IncrementalSweeper::doWork()
132 PassOwnPtr
<IncrementalSweeper
> IncrementalSweeper::create(Heap
* heap
)
134 return adoptPtr(new IncrementalSweeper(heap
->vm()));
137 void IncrementalSweeper::startSweeping(Vector
<MarkedBlock
*>&)
141 void IncrementalSweeper::willFinishSweeping()
145 void IncrementalSweeper::sweepNextBlock()