]>
git.saurik.com Git - apple/javascriptcore.git/blob - heap/CopiedBlock.h
2 * Copyright (C) 2011 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.
29 #include "BlockAllocator.h"
30 #include "CopyWorkList.h"
31 #include "HeapBlock.h"
32 #include "JSCJSValue.h"
34 #include <wtf/Atomics.h>
35 #include <wtf/OwnPtr.h>
36 #include <wtf/PassOwnPtr.h>
42 class CopiedBlock
: public HeapBlock
<CopiedBlock
> {
43 friend class CopiedSpace
;
44 friend class CopiedAllocator
;
46 static CopiedBlock
* create(DeadBlock
*);
47 static CopiedBlock
* createNoZeroFill(DeadBlock
*);
55 void reportLiveBytes(JSCell
*, unsigned);
57 void didEvacuateBytes(unsigned);
58 bool shouldEvacuate();
61 // The payload is the region of the block that is usable for allocations.
64 size_t payloadCapacity();
66 // The data is the region of the block that has been used for allocations.
71 // The wilderness is the region of the block that is usable for allocations
72 // but has not been so used.
74 char* wildernessEnd();
75 size_t wildernessSize();
80 static const size_t blockSize
= 32 * KB
;
83 CopyWorkList
& workList();
87 void zeroFillWilderness(); // Can be called at any time to zero-fill to the end of the block.
89 #if ENABLE(PARALLEL_GC)
90 SpinLock m_workListLock
;
92 OwnPtr
<CopyWorkList
> m_workList
;
99 inline CopiedBlock
* CopiedBlock::createNoZeroFill(DeadBlock
* block
)
101 Region
* region
= block
->region();
102 return new(NotNull
, block
) CopiedBlock(region
);
105 inline CopiedBlock
* CopiedBlock::create(DeadBlock
* block
)
107 CopiedBlock
* newBlock
= createNoZeroFill(block
);
108 newBlock
->zeroFillWilderness();
112 inline void CopiedBlock::zeroFillWilderness()
115 memset(wilderness(), 0, wildernessSize());
118 JSValue
* limit
= reinterpret_cast_ptr
<JSValue
*>(wildernessEnd());
119 for (JSValue
* currentValue
= reinterpret_cast_ptr
<JSValue
*>(wilderness()); currentValue
< limit
; currentValue
++)
120 *currentValue
= emptyValue
;
124 inline CopiedBlock::CopiedBlock(Region
* region
)
125 : HeapBlock
<CopiedBlock
>(region
)
126 , m_remaining(payloadCapacity())
130 #if ENABLE(PARALLEL_GC)
131 m_workListLock
.Init();
133 ASSERT(is8ByteAligned(reinterpret_cast<void*>(m_remaining
)));
136 inline void CopiedBlock::didSurviveGC()
144 inline void CopiedBlock::didEvacuateBytes(unsigned bytes
)
146 ASSERT(m_liveBytes
>= bytes
);
147 m_liveBytes
-= bytes
;
150 inline bool CopiedBlock::canBeRecycled()
155 inline bool CopiedBlock::shouldEvacuate()
157 return static_cast<double>(m_liveBytes
) / static_cast<double>(payloadCapacity()) <= Options::minCopiedBlockUtilization();
160 inline void CopiedBlock::pin()
167 inline bool CopiedBlock::isPinned()
172 inline bool CopiedBlock::isOversize()
174 return region()->isCustomSize();
177 inline unsigned CopiedBlock::liveBytes()
182 inline char* CopiedBlock::payload()
184 return reinterpret_cast<char*>(this) + ((sizeof(CopiedBlock
) + 7) & ~7);
187 inline char* CopiedBlock::payloadEnd()
189 return reinterpret_cast<char*>(this) + region()->blockSize();
192 inline size_t CopiedBlock::payloadCapacity()
194 return payloadEnd() - payload();
197 inline char* CopiedBlock::data()
202 inline char* CopiedBlock::dataEnd()
204 return payloadEnd() - m_remaining
;
207 inline size_t CopiedBlock::dataSize()
209 return dataEnd() - data();
212 inline char* CopiedBlock::wilderness()
217 inline char* CopiedBlock::wildernessEnd()
222 inline size_t CopiedBlock::wildernessSize()
224 return wildernessEnd() - wilderness();
227 inline size_t CopiedBlock::size()
232 inline size_t CopiedBlock::capacity()
234 return region()->blockSize();
237 inline bool CopiedBlock::hasWorkList()
242 inline CopyWorkList
& CopiedBlock::workList()