summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/incremental-marking.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/incremental-marking.cc')
-rw-r--r--deps/v8/src/heap/incremental-marking.cc33
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();
}