2 * Copyright (C) 2016 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.
28 #include "MarkedAllocator.h"
29 #include "MarkedBlock.h"
33 inline bool MarkedBlock::Handle::isLive(HeapVersion markingVersion, const HeapCell* cell)
35 ASSERT(!isFreeListed());
37 if (UNLIKELY(hasAnyNewlyAllocated())) {
38 if (isNewlyAllocated(cell))
42 MarkedBlock& block = this->block();
44 if (allocator()->isAllocated(this))
47 if (block.areMarksStale(markingVersion))
50 return block.isMarked(cell);
53 inline bool MarkedBlock::Handle::isLiveCell(HeapVersion markingVersion, const void* p)
55 if (!m_block->isAtom(p))
57 return isLive(markingVersion, static_cast<const HeapCell*>(p));
60 template <typename Functor>
61 inline IterationStatus MarkedBlock::Handle::forEachLiveCell(const Functor& functor)
63 HeapCell::Kind kind = m_attributes.cellKind;
64 for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell) {
65 HeapCell* cell = reinterpret_cast_ptr<HeapCell*>(&m_block->atoms()[i]);
69 if (functor(cell, kind) == IterationStatus::Done)
70 return IterationStatus::Done;
72 return IterationStatus::Continue;
75 template <typename Functor>
76 inline IterationStatus MarkedBlock::Handle::forEachDeadCell(const Functor& functor)
78 HeapCell::Kind kind = m_attributes.cellKind;
79 for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell) {
80 HeapCell* cell = reinterpret_cast_ptr<HeapCell*>(&m_block->atoms()[i]);
84 if (functor(cell, kind) == IterationStatus::Done)
85 return IterationStatus::Done;
87 return IterationStatus::Continue;
90 inline void MarkedBlock::resetMarkingVersion()
92 m_markingVersion = MarkedSpace::nullVersion;