summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/heap/CopiedSpace.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/heap/CopiedSpace.h')
-rw-r--r--Source/JavaScriptCore/heap/CopiedSpace.h65
1 files changed, 42 insertions, 23 deletions
diff --git a/Source/JavaScriptCore/heap/CopiedSpace.h b/Source/JavaScriptCore/heap/CopiedSpace.h
index 65ca04ef6..dfb720bcd 100644
--- a/Source/JavaScriptCore/heap/CopiedSpace.h
+++ b/Source/JavaScriptCore/heap/CopiedSpace.h
@@ -27,18 +27,13 @@
#define CopiedSpace_h
#include "CopiedAllocator.h"
-#include "HeapBlock.h"
+#include "HeapOperation.h"
#include "TinyBloomFilter.h"
#include <wtf/Assertions.h>
#include <wtf/CheckedBoolean.h>
#include <wtf/DoublyLinkedList.h>
#include <wtf/HashSet.h>
-#include <wtf/OSAllocator.h>
-#include <wtf/PageAllocationAligned.h>
-#include <wtf/PageBlock.h>
-#include <wtf/StdLibExtras.h>
-#include <wtf/TCSpinLock.h>
-#include <wtf/ThreadingPrimitives.h>
+#include <wtf/Lock.h>
namespace JSC {
@@ -47,7 +42,7 @@ class CopiedBlock;
class CopiedSpace {
friend class CopyVisitor;
- friend class GCThreadSharedData;
+ friend class Heap;
friend class SlotVisitor;
friend class JIT;
public:
@@ -60,9 +55,12 @@ public:
CopiedAllocator& allocator() { return m_allocator; }
+ void didStartFullCollection();
+
+ template <HeapOperation collectionType>
void startedCopying();
void doneCopying();
- bool isInCopyPhase() { return m_inCopyingPhase; }
+ bool isInCopyPhase() const { return m_inCopyingPhase; }
void pin(CopiedBlock*);
bool isPinned(void*);
@@ -76,10 +74,19 @@ public:
size_t capacity();
bool isPagedOut(double deadline);
- bool shouldDoCopyPhase() { return m_shouldDoCopyPhase; }
+ bool shouldDoCopyPhase() const { return m_shouldDoCopyPhase; }
static CopiedBlock* blockFor(void*);
+ Heap* heap() const { return m_heap; }
+
+ size_t takeBytesRemovedFromOldSpaceDueToReallocation()
+ {
+ size_t result = 0;
+ std::swap(m_bytesRemovedFromOldSpaceDueToReallocation, result);
+ return result;
+ }
+
private:
static bool isOversize(size_t);
@@ -91,34 +98,46 @@ private:
CopiedBlock* allocateBlockForCopyingPhase();
void doneFillingBlock(CopiedBlock*, CopiedBlock**);
- void recycleEvacuatedBlock(CopiedBlock*);
+ void recycleEvacuatedBlock(CopiedBlock*, HeapOperation collectionType);
void recycleBorrowedBlock(CopiedBlock*);
Heap* m_heap;
CopiedAllocator m_allocator;
- TinyBloomFilter m_blockFilter;
HashSet<CopiedBlock*> m_blockSet;
- SpinLock m_toSpaceLock;
+ Lock m_toSpaceLock;
+
+ struct CopiedGeneration {
+ CopiedGeneration()
+ : toSpace(0)
+ , fromSpace(0)
+ {
+ }
+
+ DoublyLinkedList<CopiedBlock>* toSpace;
+ DoublyLinkedList<CopiedBlock>* fromSpace;
+
+ DoublyLinkedList<CopiedBlock> blocks1;
+ DoublyLinkedList<CopiedBlock> blocks2;
+ DoublyLinkedList<CopiedBlock> oversizeBlocks;
+
+ TinyBloomFilter blockFilter;
+ };
+
+ CopiedGeneration m_oldGen;
+ CopiedGeneration m_newGen;
- DoublyLinkedList<CopiedBlock>* m_toSpace;
- DoublyLinkedList<CopiedBlock>* m_fromSpace;
-
- DoublyLinkedList<CopiedBlock> m_blocks1;
- DoublyLinkedList<CopiedBlock> m_blocks2;
- DoublyLinkedList<CopiedBlock> m_oversizeBlocks;
-
bool m_inCopyingPhase;
bool m_shouldDoCopyPhase;
- Mutex m_loanedBlocksLock;
- ThreadCondition m_loanedBlocksCondition;
+ Lock m_loanedBlocksLock;
size_t m_numberOfLoanedBlocks;
+
+ size_t m_bytesRemovedFromOldSpaceDueToReallocation;
static const size_t s_maxAllocationSize = CopiedBlock::blockSize / 2;
- static const size_t s_initialBlockNum = 16;
static const size_t s_blockMask = ~(CopiedBlock::blockSize - 1);
};