diff options
Diffstat (limited to 'deps/v8/src/heap/incremental-marking.cc')
-rw-r--r-- | deps/v8/src/heap/incremental-marking.cc | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/deps/v8/src/heap/incremental-marking.cc b/deps/v8/src/heap/incremental-marking.cc index 55f2d6998c..a653877f40 100644 --- a/deps/v8/src/heap/incremental-marking.cc +++ b/deps/v8/src/heap/incremental-marking.cc @@ -47,13 +47,15 @@ void IncrementalMarking::Observer::Step(int bytes_allocated, Address addr, incremental_marking_->EnsureBlackAllocated(addr, size); } -IncrementalMarking::IncrementalMarking(Heap* heap, - WeakObjects* weak_objects) +IncrementalMarking::IncrementalMarking(Heap* heap, WeakObjects* weak_objects) : heap_(heap), collector_(heap->mark_compact_collector()), weak_objects_(weak_objects), new_generation_observer_(this, kYoungGenerationAllocatedThreshold), - old_generation_observer_(this, kOldGenerationAllocatedThreshold) { + old_generation_observer_(this, kOldGenerationAllocatedThreshold), + marking_state_(heap->isolate()), + atomic_marking_state_(heap->isolate()), + non_atomic_marking_state_(heap->isolate()) { SetState(STOPPED); } @@ -109,19 +111,19 @@ class IncrementalMarkingRootMarkingVisitor : public RootVisitor { void VisitRootPointer(Root root, const char* description, FullObjectSlot p) override { DCHECK(!MapWord::IsPacked((*p).ptr())); - MarkObjectByPointer(p); + MarkObjectByPointer(root, p); } void VisitRootPointers(Root root, const char* description, FullObjectSlot start, FullObjectSlot end) override { for (FullObjectSlot p = start; p < end; ++p) { DCHECK(!MapWord::IsPacked((*p).ptr())); - MarkObjectByPointer(p); + MarkObjectByPointer(root, p); } } private: - void MarkObjectByPointer(FullObjectSlot p) { + void MarkObjectByPointer(Root root, FullObjectSlot p) { Object object = *p; if (!object.IsHeapObject()) return; DCHECK(!MapWord::IsPacked(object.ptr())); @@ -129,7 +131,7 @@ class IncrementalMarkingRootMarkingVisitor : public RootVisitor { BasicMemoryChunk* target_page = BasicMemoryChunk::FromHeapObject(heap_object); if (target_page->InSharedHeap()) return; - heap_->incremental_marking()->WhiteToGreyAndPush(heap_object); + heap_->incremental_marking()->MarkRootObject(root, heap_object); } Heap* heap_; @@ -231,7 +233,8 @@ void IncrementalMarking::StartMarking() { heap_->InvokeIncrementalMarkingPrologueCallbacks(); - is_compacting_ = !FLAG_never_compact && collector_->StartCompaction(); + is_compacting_ = collector_->StartCompaction( + MarkCompactCollector::StartCompactionMode::kIncremental); collector_->StartMarking(); SetState(MARKING); @@ -435,6 +438,7 @@ void IncrementalMarking::UpdateMarkingWorklistAfterScavenge() { collector_->local_marking_worklists()->Publish(); MarkingBarrier::PublishAll(heap()); + PtrComprCageBase cage_base(heap_->isolate()); collector_->marking_worklists()->Update( [ #ifdef DEBUG @@ -444,11 +448,11 @@ void IncrementalMarking::UpdateMarkingWorklistAfterScavenge() { #ifdef ENABLE_MINOR_MC minor_marking_state, #endif - filler_map](HeapObject obj, HeapObject* out) -> bool { + cage_base, filler_map](HeapObject obj, HeapObject* out) -> bool { DCHECK(obj.IsHeapObject()); // Only pointers to from space have to be updated. if (Heap::InFromPage(obj)) { - MapWord map_word = obj.map_word(kRelaxedLoad); + MapWord map_word = obj.map_word(cage_base, kRelaxedLoad); if (!map_word.IsForwardingAddress()) { // There may be objects on the marking deque that do not exist // anymore, e.g. left trimmed objects or objects from the root set @@ -489,10 +493,10 @@ void IncrementalMarking::UpdateMarkingWorklistAfterScavenge() { return true; } DCHECK_IMPLIES(marking_state()->IsWhite(obj), - obj.IsFreeSpaceOrFiller()); + obj.IsFreeSpaceOrFiller(cage_base)); // Skip one word filler objects that appear on the // stack when we perform in place array shift. - if (obj.map() != filler_map) { + if (obj.map(cage_base) != filler_map) { *out = obj; return true; } @@ -500,6 +504,7 @@ void IncrementalMarking::UpdateMarkingWorklistAfterScavenge() { } }); + collector_->local_weak_objects()->Publish(); weak_objects_->UpdateAfterScavenge(); } @@ -638,7 +643,7 @@ void IncrementalMarking::FinalizeMarking(CompletionAction action) { "[IncrementalMarking] requesting finalization of incremental " "marking.\n"); } - request_type_ = FINALIZATION; + request_type_ = GCRequestType::FINALIZATION; if (action == GC_VIA_STACK_GUARD) { heap_->isolate()->stack_guard()->RequestGC(); } @@ -708,7 +713,7 @@ void IncrementalMarking::MarkingComplete(CompletionAction action) { heap()->isolate()->PrintWithTimestamp( "[IncrementalMarking] Complete (normal).\n"); } - request_type_ = COMPLETE_MARKING; + request_type_ = GCRequestType::COMPLETE_MARKING; if (action == GC_VIA_STACK_GUARD) { heap_->isolate()->stack_guard()->RequestGC(); } |