Index: src/heap/mark-compact.h |
diff --git a/src/heap/mark-compact.h b/src/heap/mark-compact.h |
index a5a5f02ee7cb4a0db6306b963d7fb36e46bd1896..b01982fb467832b9eaa5b83203ae2b2bd4b23298 100644 |
--- a/src/heap/mark-compact.h |
+++ b/src/heap/mark-compact.h |
@@ -182,18 +182,15 @@ class Marking { |
class MarkingDeque { |
public: |
MarkingDeque() |
- : array_(NULL), top_(0), bottom_(0), mask_(0), overflowed_(false) {} |
- |
- void Initialize(Address low, Address high) { |
- HeapObject** obj_low = reinterpret_cast<HeapObject**>(low); |
- HeapObject** obj_high = reinterpret_cast<HeapObject**>(high); |
- array_ = obj_low; |
- mask_ = base::bits::RoundDownToPowerOfTwo32( |
- static_cast<uint32_t>(obj_high - obj_low)) - |
- 1; |
- top_ = bottom_ = 0; |
- overflowed_ = false; |
- } |
+ : array_(NULL), |
+ top_(0), |
+ bottom_(0), |
+ mask_(0), |
+ overflowed_(false), |
+ in_use_(false) {} |
+ |
+ void Initialize(Address low, Address high); |
+ void Uninitialize(bool aborting = false); |
inline bool IsFull() { return ((top_ + 1) & mask_) == bottom_; } |
@@ -201,6 +198,8 @@ class MarkingDeque { |
bool overflowed() const { return overflowed_; } |
+ bool in_use() const { return in_use_; } |
+ |
void ClearOverflowed() { overflowed_ = false; } |
void SetOverflowed() { overflowed_ = true; } |
@@ -242,7 +241,6 @@ class MarkingDeque { |
INLINE(void UnshiftGrey(HeapObject* object)) { |
DCHECK(object->IsHeapObject()); |
- DCHECK(Marking::IsGrey(Marking::MarkBitFrom(object))); |
if (IsFull()) { |
SetOverflowed(); |
} else { |
@@ -279,6 +277,7 @@ class MarkingDeque { |
int bottom_; |
int mask_; |
bool overflowed_; |
+ bool in_use_; |
DISALLOW_COPY_AND_ASSIGN(MarkingDeque); |
}; |
@@ -720,11 +719,20 @@ class MarkCompactCollector { |
MarkingDeque* marking_deque() { return &marking_deque_; } |
- void EnsureMarkingDequeIsCommittedAndInitialize(size_t max_size = 4 * MB); |
+ static const size_t kMaxMarkingDequeSize = 4 * MB; |
+ static const size_t kMinMarkingDequeSize = 256 * KB; |
- void InitializeMarkingDeque(); |
+ void EnsureMarkingDequeIsCommittedAndInitialize(size_t max_size) { |
+ if (!marking_deque_.in_use()) { |
+ EnsureMarkingDequeIsCommitted(max_size); |
+ InitializeMarkingDeque(); |
+ } |
+ } |
- void UncommitMarkingDeque(); |
+ void EnsureMarkingDequeIsCommitted(size_t max_size); |
+ void EnsureMarkingDequeIsReserved(); |
+ |
+ void InitializeMarkingDeque(); |
// The following four methods can just be called after marking, when the |
// whole transitive closure is known. They must be called before sweeping |
@@ -954,7 +962,7 @@ class MarkCompactCollector { |
Heap* heap_; |
base::VirtualMemory* marking_deque_memory_; |
- bool marking_deque_memory_committed_; |
+ size_t marking_deque_memory_committed_; |
MarkingDeque marking_deque_; |
CodeFlusher* code_flusher_; |
bool have_code_to_deoptimize_; |