| Index: src/heap/incremental-marking.cc
|
| diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc
|
| index 9806b4edbdad193bbba387eda8336ff960193e07..7ab3bf85c838f4e5456caac328f6b06de227af9d 100644
|
| --- a/src/heap/incremental-marking.cc
|
| +++ b/src/heap/incremental-marking.cc
|
| @@ -19,8 +19,6 @@ namespace internal {
|
| IncrementalMarking::IncrementalMarking(Heap* heap)
|
| : heap_(heap),
|
| state_(STOPPED),
|
| - marking_deque_memory_(NULL),
|
| - marking_deque_memory_committed_(false),
|
| steps_count_(0),
|
| old_generation_space_available_at_start_of_incremental_(0),
|
| old_generation_space_used_at_start_of_incremental_(0),
|
| @@ -32,9 +30,6 @@ IncrementalMarking::IncrementalMarking(Heap* heap)
|
| unscanned_bytes_of_large_object_(0) {}
|
|
|
|
|
| -void IncrementalMarking::TearDown() { delete marking_deque_memory_; }
|
| -
|
| -
|
| void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot,
|
| Object* value) {
|
| if (BaseRecordWrite(obj, slot, value) && slot != NULL) {
|
| @@ -195,11 +190,12 @@ class IncrementalMarkingMarkingVisitor
|
| HeapObject::RawField(object, end_offset));
|
| start_offset = end_offset;
|
| end_offset = Min(object_size, end_offset + kProgressBarScanningChunk);
|
| - scan_until_end = heap->incremental_marking()->marking_deque()->IsFull();
|
| + scan_until_end =
|
| + heap->mark_compact_collector()->marking_deque()->IsFull();
|
| } while (scan_until_end && start_offset < object_size);
|
| chunk->set_progress_bar(start_offset);
|
| if (start_offset < object_size) {
|
| - heap->incremental_marking()->marking_deque()->UnshiftGrey(object);
|
| + heap->mark_compact_collector()->marking_deque()->UnshiftGrey(object);
|
| heap->incremental_marking()->NotifyIncompleteScanOfObject(
|
| object_size - (start_offset - already_scanned_offset));
|
| }
|
| @@ -482,32 +478,6 @@ static void PatchIncrementalMarkingRecordWriteStubs(
|
| }
|
|
|
|
|
| -void IncrementalMarking::EnsureMarkingDequeIsCommitted() {
|
| - if (marking_deque_memory_ == NULL) {
|
| - marking_deque_memory_ = new base::VirtualMemory(4 * MB);
|
| - }
|
| - if (!marking_deque_memory_committed_) {
|
| - bool success = marking_deque_memory_->Commit(
|
| - reinterpret_cast<Address>(marking_deque_memory_->address()),
|
| - marking_deque_memory_->size(),
|
| - false); // Not executable.
|
| - CHECK(success);
|
| - marking_deque_memory_committed_ = true;
|
| - }
|
| -}
|
| -
|
| -
|
| -void IncrementalMarking::UncommitMarkingDeque() {
|
| - if (state_ == STOPPED && marking_deque_memory_committed_) {
|
| - bool success = marking_deque_memory_->Uncommit(
|
| - reinterpret_cast<Address>(marking_deque_memory_->address()),
|
| - marking_deque_memory_->size());
|
| - CHECK(success);
|
| - marking_deque_memory_committed_ = false;
|
| - }
|
| -}
|
| -
|
| -
|
| void IncrementalMarking::Start(CompactionFlag flag) {
|
| if (FLAG_trace_incremental_marking) {
|
| PrintF("[IncrementalMarking] Start\n");
|
| @@ -550,13 +520,7 @@ void IncrementalMarking::StartMarking(CompactionFlag flag) {
|
|
|
| PatchIncrementalMarkingRecordWriteStubs(heap_, mode);
|
|
|
| - EnsureMarkingDequeIsCommitted();
|
| -
|
| - // Initialize marking stack.
|
| - Address addr = static_cast<Address>(marking_deque_memory_->address());
|
| - size_t size = marking_deque_memory_->size();
|
| - if (FLAG_force_marking_deque_overflows) size = 64 * kPointerSize;
|
| - marking_deque_.Initialize(addr, addr + size);
|
| + heap_->mark_compact_collector()->EnsureMarkingDequeIsCommittedAndInitialize();
|
|
|
| ActivateIncrementalWriteBarrier();
|
|
|
| @@ -602,10 +566,12 @@ void IncrementalMarking::PrepareForScavenge() {
|
| void IncrementalMarking::UpdateMarkingDequeAfterScavenge() {
|
| if (!IsMarking()) return;
|
|
|
| - int current = marking_deque_.bottom();
|
| - int mask = marking_deque_.mask();
|
| - int limit = marking_deque_.top();
|
| - HeapObject** array = marking_deque_.array();
|
| + MarkingDeque* marking_deque =
|
| + heap_->mark_compact_collector()->marking_deque();
|
| + int current = marking_deque->bottom();
|
| + int mask = marking_deque->mask();
|
| + int limit = marking_deque->top();
|
| + HeapObject** array = marking_deque->array();
|
| int new_top = current;
|
|
|
| Map* filler_map = heap_->one_pointer_filler_map();
|
| @@ -620,7 +586,7 @@ void IncrementalMarking::UpdateMarkingDequeAfterScavenge() {
|
| HeapObject* dest = map_word.ToForwardingAddress();
|
| array[new_top] = dest;
|
| new_top = ((new_top + 1) & mask);
|
| - DCHECK(new_top != marking_deque_.bottom());
|
| + DCHECK(new_top != marking_deque->bottom());
|
| #ifdef DEBUG
|
| MarkBit mark_bit = Marking::MarkBitFrom(obj);
|
| DCHECK(Marking::IsGrey(mark_bit) ||
|
| @@ -632,7 +598,7 @@ void IncrementalMarking::UpdateMarkingDequeAfterScavenge() {
|
| // stack when we perform in place array shift.
|
| array[new_top] = obj;
|
| new_top = ((new_top + 1) & mask);
|
| - DCHECK(new_top != marking_deque_.bottom());
|
| + DCHECK(new_top != marking_deque->bottom());
|
| #ifdef DEBUG
|
| MarkBit mark_bit = Marking::MarkBitFrom(obj);
|
| MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address());
|
| @@ -643,7 +609,7 @@ void IncrementalMarking::UpdateMarkingDequeAfterScavenge() {
|
| #endif
|
| }
|
| }
|
| - marking_deque_.set_top(new_top);
|
| + marking_deque->set_top(new_top);
|
| }
|
|
|
|
|
| @@ -670,8 +636,10 @@ void IncrementalMarking::VisitObject(Map* map, HeapObject* obj, int size) {
|
| intptr_t IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
|
| intptr_t bytes_processed = 0;
|
| Map* filler_map = heap_->one_pointer_filler_map();
|
| - while (!marking_deque_.IsEmpty() && bytes_processed < bytes_to_process) {
|
| - HeapObject* obj = marking_deque_.Pop();
|
| + MarkingDeque* marking_deque =
|
| + heap_->mark_compact_collector()->marking_deque();
|
| + while (!marking_deque->IsEmpty() && bytes_processed < bytes_to_process) {
|
| + HeapObject* obj = marking_deque->Pop();
|
|
|
| // Explicitly skip one word fillers. Incremental markbit patterns are
|
| // correct only for objects that occupy at least two words.
|
| @@ -692,8 +660,10 @@ intptr_t IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
|
|
|
| void IncrementalMarking::ProcessMarkingDeque() {
|
| Map* filler_map = heap_->one_pointer_filler_map();
|
| - while (!marking_deque_.IsEmpty()) {
|
| - HeapObject* obj = marking_deque_.Pop();
|
| + MarkingDeque* marking_deque =
|
| + heap_->mark_compact_collector()->marking_deque();
|
| + while (!marking_deque->IsEmpty()) {
|
| + HeapObject* obj = marking_deque->Pop();
|
|
|
| // Explicitly skip one word fillers. Incremental markbit patterns are
|
| // correct only for objects that occupy at least two words.
|
| @@ -793,7 +763,7 @@ void IncrementalMarking::Finalize() {
|
| PatchIncrementalMarkingRecordWriteStubs(heap_,
|
| RecordWriteStub::STORE_BUFFER_ONLY);
|
| DeactivateIncrementalWriteBarrier();
|
| - DCHECK(marking_deque_.IsEmpty());
|
| + DCHECK(heap_->mark_compact_collector()->marking_deque()->IsEmpty());
|
| heap_->isolate()->stack_guard()->ClearGC();
|
| }
|
|
|
| @@ -946,7 +916,7 @@ intptr_t IncrementalMarking::Step(intptr_t allocated_bytes,
|
| }
|
| } else if (state_ == MARKING) {
|
| bytes_processed = ProcessMarkingDeque(bytes_to_process);
|
| - if (marking_deque_.IsEmpty()) {
|
| + if (heap_->mark_compact_collector()->marking_deque()->IsEmpty()) {
|
| if (completion == FORCE_COMPLETION ||
|
| IsIdleMarkingDelayCounterLimitReached()) {
|
| MarkingComplete(action);
|
|
|