1/* 2 * Copyright (C) 2012 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 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. 12 * 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. 24 */ 25 26#include "config.h" 27#include "IncrementalSweeper.h" 28 29#include "DelayedReleaseScope.h" 30#include "Heap.h" 31#include "JSObject.h" 32#include "JSString.h" 33#include "MarkedBlock.h" 34#include "JSCInlines.h" 35 36#include <wtf/HashSet.h> 37#include <wtf/WTFThreadData.h> 38 39namespace JSC { 40 41#if USE(CF) 42 43static const double sweepTimeSlice = .01; // seconds 44static const double sweepTimeTotal = .10; 45static const double sweepTimeMultiplier = 1.0 / sweepTimeTotal; 46 47IncrementalSweeper::IncrementalSweeper(Heap* heap, CFRunLoopRef runLoop) 48 : HeapTimer(heap->vm(), runLoop) 49 , m_currentBlockToSweepIndex(0) 50 , m_blocksToSweep(heap->m_blockSnapshot) 51{ 52} 53 54PassOwnPtr<IncrementalSweeper> IncrementalSweeper::create(Heap* heap) 55{ 56 return adoptPtr(new IncrementalSweeper(heap, CFRunLoopGetCurrent())); 57} 58 59void IncrementalSweeper::scheduleTimer() 60{ 61 CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + (sweepTimeSlice * sweepTimeMultiplier)); 62} 63 64void IncrementalSweeper::cancelTimer() 65{ 66 CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + s_decade); 67} 68 69void IncrementalSweeper::doWork() 70{ 71 doSweep(WTF::monotonicallyIncreasingTime()); 72} 73 74void IncrementalSweeper::doSweep(double sweepBeginTime) 75{ 76 DelayedReleaseScope scope(m_vm->heap.m_objectSpace); 77 while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { 78 sweepNextBlock(); 79 80 double elapsedTime = WTF::monotonicallyIncreasingTime() - sweepBeginTime; 81 if (elapsedTime < sweepTimeSlice) 82 continue; 83 84 scheduleTimer(); 85 return; 86 } 87 88 m_blocksToSweep.clear(); 89 cancelTimer(); 90} 91 92void IncrementalSweeper::sweepNextBlock() 93{ 94 while (m_currentBlockToSweepIndex < m_blocksToSweep.size()) { 95 MarkedBlock* block = m_blocksToSweep[m_currentBlockToSweepIndex++]; 96 97 if (!block->needsSweeping()) 98 continue; 99 100 block->sweep(); 101 m_vm->heap.objectSpace().freeOrShrinkBlock(block); 102 return; 103 } 104} 105 106void IncrementalSweeper::startSweeping(Vector<MarkedBlock*>& blockSnapshot) 107{ 108 m_blocksToSweep = blockSnapshot; 109 m_currentBlockToSweepIndex = 0; 110 scheduleTimer(); 111} 112 113void IncrementalSweeper::willFinishSweeping() 114{ 115 m_currentBlockToSweepIndex = 0; 116 m_blocksToSweep.clear(); 117 if (m_vm) 118 cancelTimer(); 119} 120 121#else 122 123IncrementalSweeper::IncrementalSweeper(VM* vm) 124 : HeapTimer(vm) 125{ 126} 127 128void IncrementalSweeper::doWork() 129{ 130} 131 132PassOwnPtr<IncrementalSweeper> IncrementalSweeper::create(Heap* heap) 133{ 134 return adoptPtr(new IncrementalSweeper(heap->vm())); 135} 136 137void IncrementalSweeper::startSweeping(Vector<MarkedBlock*>&) 138{ 139} 140 141void IncrementalSweeper::willFinishSweeping() 142{ 143} 144 145void IncrementalSweeper::sweepNextBlock() 146{ 147} 148 149#endif 150 151} // namespace JSC 152