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. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "WeakSet.h" 28 29#include "Heap.h" 30#include "JSCInlines.h" 31#include "VM.h" 32 33namespace JSC { 34 35WeakSet::~WeakSet() 36{ 37 WeakBlock* next = 0; 38 for (WeakBlock* block = m_blocks.head(); block; block = next) { 39 next = block->next(); 40 heap()->blockAllocator().deallocate(WeakBlock::destroy(block)); 41 } 42 m_blocks.clear(); 43} 44 45void WeakSet::sweep() 46{ 47 for (WeakBlock* block = m_blocks.head(); block; block = block->next()) 48 block->sweep(); 49 50 resetAllocator(); 51} 52 53WeakBlock::FreeCell* WeakSet::findAllocator() 54{ 55 if (WeakBlock::FreeCell* allocator = tryFindAllocator()) 56 return allocator; 57 58 return addAllocator(); 59} 60 61WeakBlock::FreeCell* WeakSet::tryFindAllocator() 62{ 63 while (m_nextAllocator) { 64 WeakBlock* block = m_nextAllocator; 65 m_nextAllocator = m_nextAllocator->next(); 66 67 WeakBlock::SweepResult sweepResult = block->takeSweepResult(); 68 if (sweepResult.freeList) 69 return sweepResult.freeList; 70 } 71 72 return 0; 73} 74 75WeakBlock::FreeCell* WeakSet::addAllocator() 76{ 77 WeakBlock* block = WeakBlock::create(heap()->blockAllocator().allocate<WeakBlock>()); 78 heap()->didAllocate(WeakBlock::blockSize); 79 m_blocks.append(block); 80 WeakBlock::SweepResult sweepResult = block->takeSweepResult(); 81 ASSERT(!sweepResult.isNull() && sweepResult.freeList); 82 return sweepResult.freeList; 83} 84 85void WeakSet::removeAllocator(WeakBlock* block) 86{ 87 m_blocks.remove(block); 88 heap()->blockAllocator().deallocate(WeakBlock::destroy(block)); 89} 90 91} // namespace JSC 92