blob: 556c8515bd23a71117cf866b81dec8a19ec55bb6 [file] [log] [blame]
ggaren@apple.com76215812012-04-04 05:28:13 +00001/*
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"
ggaren@apple.com61b97002012-04-06 22:35:55 +000027#include "WeakSet.h"
ggaren@apple.com76215812012-04-04 05:28:13 +000028
29#include "Heap.h"
fpizlo@apple.comfb7eff22014-02-11 01:45:50 +000030#include "JSCInlines.h"
ggaren@apple.com9a9a4b52013-04-18 19:32:17 +000031#include "VM.h"
ggaren@apple.com76215812012-04-04 05:28:13 +000032
33namespace JSC {
34
ggaren@apple.com61b97002012-04-06 22:35:55 +000035WeakSet::~WeakSet()
ggaren@apple.com76215812012-04-04 05:28:13 +000036{
37 WeakBlock* next = 0;
ggaren@apple.com87daa5c2012-04-28 04:26:01 +000038 for (WeakBlock* block = m_blocks.head(); block; block = next) {
39 next = block->next();
mhahnenberg@apple.com32e18322012-11-07 23:34:30 +000040 heap()->blockAllocator().deallocate(WeakBlock::destroy(block));
ggaren@apple.com76215812012-04-04 05:28:13 +000041 }
42 m_blocks.clear();
43}
44
ggaren@apple.com61b97002012-04-06 22:35:55 +000045void WeakSet::sweep()
ggaren@apple.com76215812012-04-04 05:28:13 +000046{
ggaren@apple.com218a16a2012-06-08 23:57:58 +000047 for (WeakBlock* block = m_blocks.head(); block; block = block->next())
ggaren@apple.com825cc102012-06-05 03:17:15 +000048 block->sweep();
ggaren@apple.com218a16a2012-06-08 23:57:58 +000049
50 resetAllocator();
ggaren@apple.com76215812012-04-04 05:28:13 +000051}
52
ggaren@apple.com61b97002012-04-06 22:35:55 +000053WeakBlock::FreeCell* WeakSet::findAllocator()
ggaren@apple.com76215812012-04-04 05:28:13 +000054{
55 if (WeakBlock::FreeCell* allocator = tryFindAllocator())
56 return allocator;
57
ggaren@apple.com76215812012-04-04 05:28:13 +000058 return addAllocator();
59}
60
ggaren@apple.com61b97002012-04-06 22:35:55 +000061WeakBlock::FreeCell* WeakSet::tryFindAllocator()
ggaren@apple.com76215812012-04-04 05:28:13 +000062{
63 while (m_nextAllocator) {
64 WeakBlock* block = m_nextAllocator;
ggaren@apple.com87daa5c2012-04-28 04:26:01 +000065 m_nextAllocator = m_nextAllocator->next();
ggaren@apple.com76215812012-04-04 05:28:13 +000066
ggaren@apple.com76215812012-04-04 05:28:13 +000067 WeakBlock::SweepResult sweepResult = block->takeSweepResult();
68 if (sweepResult.freeList)
69 return sweepResult.freeList;
70 }
71
72 return 0;
73}
74
ggaren@apple.com61b97002012-04-06 22:35:55 +000075WeakBlock::FreeCell* WeakSet::addAllocator()
ggaren@apple.com76215812012-04-04 05:28:13 +000076{
mhahnenberg@apple.com32e18322012-11-07 23:34:30 +000077 WeakBlock* block = WeakBlock::create(heap()->blockAllocator().allocate<WeakBlock>());
ggaren@apple.comd84288e2012-09-01 00:08:18 +000078 heap()->didAllocate(WeakBlock::blockSize);
ggaren@apple.com76215812012-04-04 05:28:13 +000079 m_blocks.append(block);
80 WeakBlock::SweepResult sweepResult = block->takeSweepResult();
81 ASSERT(!sweepResult.isNull() && sweepResult.freeList);
82 return sweepResult.freeList;
83}
84
ggaren@apple.com61b97002012-04-06 22:35:55 +000085void WeakSet::removeAllocator(WeakBlock* block)
ggaren@apple.com76215812012-04-04 05:28:13 +000086{
87 m_blocks.remove(block);
mhahnenberg@apple.com899e5f72013-02-19 18:12:03 +000088 heap()->blockAllocator().deallocate(WeakBlock::destroy(block));
ggaren@apple.com76215812012-04-04 05:28:13 +000089}
90
91} // namespace JSC