summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/heap/CopiedBlock.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/heap/CopiedBlock.h')
-rw-r--r--Source/JavaScriptCore/heap/CopiedBlock.h64
1 files changed, 36 insertions, 28 deletions
diff --git a/Source/JavaScriptCore/heap/CopiedBlock.h b/Source/JavaScriptCore/heap/CopiedBlock.h
index 83fdb08da..7f585585c 100644
--- a/Source/JavaScriptCore/heap/CopiedBlock.h
+++ b/Source/JavaScriptCore/heap/CopiedBlock.h
@@ -27,11 +27,14 @@
#define CopiedBlock_h
#include "BlockAllocator.h"
+#include "CopyWorkList.h"
#include "HeapBlock.h"
#include "JSValue.h"
#include "JSValueInlines.h"
#include "Options.h"
#include <wtf/Atomics.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
namespace JSC {
@@ -44,12 +47,13 @@ public:
static CopiedBlock* create(DeadBlock*);
static CopiedBlock* createNoZeroFill(DeadBlock*);
+ void pin();
bool isPinned();
unsigned liveBytes();
- void reportLiveBytes(unsigned);
+ void reportLiveBytes(JSCell*, unsigned);
void didSurviveGC();
- bool didEvacuateBytes(unsigned);
+ void didEvacuateBytes(unsigned);
bool shouldEvacuate();
bool canBeRecycled();
@@ -74,10 +78,18 @@ public:
static const size_t blockSize = 32 * KB;
+ bool hasWorkList();
+ CopyWorkList& workList();
+
private:
CopiedBlock(Region*);
void zeroFillWilderness(); // Can be called at any time to zero-fill to the end of the block.
+#if ENABLE(PARALLEL_GC)
+ SpinLock m_workListLock;
+#endif
+ OwnPtr<CopyWorkList> m_workList;
+
size_t m_remaining;
uintptr_t m_isPinned;
unsigned m_liveBytes;
@@ -114,45 +126,24 @@ inline CopiedBlock::CopiedBlock(Region* region)
, m_isPinned(false)
, m_liveBytes(0)
{
- ASSERT(is8ByteAligned(reinterpret_cast<void*>(m_remaining)));
-}
-
-inline void CopiedBlock::reportLiveBytes(unsigned bytes)
-{
#if ENABLE(PARALLEL_GC)
- unsigned oldValue = 0;
- unsigned newValue = 0;
- do {
- oldValue = m_liveBytes;
- newValue = oldValue + bytes;
- } while (!WTF::weakCompareAndSwap(&m_liveBytes, oldValue, newValue));
-#else
- m_liveBytes += bytes;
+ m_workListLock.Init();
#endif
+ ASSERT(is8ByteAligned(reinterpret_cast<void*>(m_remaining)));
}
inline void CopiedBlock::didSurviveGC()
{
m_liveBytes = 0;
m_isPinned = false;
+ if (m_workList)
+ m_workList.clear();
}
-inline bool CopiedBlock::didEvacuateBytes(unsigned bytes)
+inline void CopiedBlock::didEvacuateBytes(unsigned bytes)
{
ASSERT(m_liveBytes >= bytes);
-#if ENABLE(PARALLEL_GC)
- unsigned oldValue = 0;
- unsigned newValue = 0;
- do {
- oldValue = m_liveBytes;
- newValue = oldValue - bytes;
- } while (!WTF::weakCompareAndSwap(&m_liveBytes, oldValue, newValue));
- ASSERT(m_liveBytes < oldValue);
- return !newValue;
-#else
m_liveBytes -= bytes;
- return !m_liveBytes;
-#endif
}
inline bool CopiedBlock::canBeRecycled()
@@ -165,6 +156,13 @@ inline bool CopiedBlock::shouldEvacuate()
return static_cast<double>(m_liveBytes) / static_cast<double>(payloadCapacity()) <= Options::minCopiedBlockUtilization();
}
+inline void CopiedBlock::pin()
+{
+ m_isPinned = true;
+ if (m_workList)
+ m_workList.clear();
+}
+
inline bool CopiedBlock::isPinned()
{
return m_isPinned;
@@ -230,6 +228,16 @@ inline size_t CopiedBlock::capacity()
return region()->blockSize();
}
+inline bool CopiedBlock::hasWorkList()
+{
+ return !!m_workList;
+}
+
+inline CopyWorkList& CopiedBlock::workList()
+{
+ return *m_workList;
+}
+
} // namespace JSC
#endif