diff options
Diffstat (limited to 'deps/v8/src/heap/cppgc/marker.cc')
-rw-r--r-- | deps/v8/src/heap/cppgc/marker.cc | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/deps/v8/src/heap/cppgc/marker.cc b/deps/v8/src/heap/cppgc/marker.cc index 88f2f3c608..c2bbba1076 100644 --- a/deps/v8/src/heap/cppgc/marker.cc +++ b/deps/v8/src/heap/cppgc/marker.cc @@ -214,7 +214,7 @@ void MarkerBase::StartMarking() { is_marking_ = true; if (EnterIncrementalMarkingIfNeeded(config_, heap())) { - StatsCollector::EnabledScope stats_scope( + StatsCollector::EnabledScope inner_stats_scope( heap().stats_collector(), StatsCollector::kMarkIncrementalStart); // Performing incremental or concurrent marking. @@ -243,13 +243,6 @@ void MarkerBase::EnterAtomicPause(MarkingConfig::StackState stack_state) { } config_.stack_state = stack_state; config_.marking_type = MarkingConfig::MarkingType::kAtomic; - mutator_marking_state_.set_in_atomic_pause(); - - // Lock guards against changes to {Weak}CrossThreadPersistent handles, that - // may conflict with marking. E.g., a WeakCrossThreadPersistent may be - // converted into a CrossThreadPersistent which requires that the handle - // is either cleared or the object is retained. - g_process_mutex.Pointer()->Lock(); { // VisitRoots also resets the LABs. @@ -308,6 +301,7 @@ void MarkerBase::ProcessWeakness() { heap().GetWeakPersistentRegion().Trace(&visitor()); // Processing cross-thread handles requires taking the process lock. g_process_mutex.Get().AssertHeld(); + CHECK(visited_cross_thread_persistents_in_atomic_pause_); heap().GetWeakCrossThreadPersistentRegion().Trace(&visitor()); // Call weak callbacks on objects that may now be pointing to dead objects. @@ -337,13 +331,6 @@ void MarkerBase::VisitRoots(MarkingConfig::StackState stack_state) { heap().stats_collector(), StatsCollector::kMarkVisitPersistents); heap().GetStrongPersistentRegion().Trace(&visitor()); } - if (config_.marking_type == MarkingConfig::MarkingType::kAtomic) { - StatsCollector::DisabledScope inner_stats_scope( - heap().stats_collector(), - StatsCollector::kMarkVisitCrossThreadPersistents); - g_process_mutex.Get().AssertHeld(); - heap().GetStrongCrossThreadPersistentRegion().Trace(&visitor()); - } } if (stack_state != MarkingConfig::StackState::kNoHeapPointers) { @@ -356,6 +343,24 @@ void MarkerBase::VisitRoots(MarkingConfig::StackState stack_state) { } } +bool MarkerBase::VisitCrossThreadPersistentsIfNeeded() { + if (config_.marking_type != MarkingConfig::MarkingType::kAtomic || + visited_cross_thread_persistents_in_atomic_pause_) + return false; + + StatsCollector::DisabledScope inner_stats_scope( + heap().stats_collector(), + StatsCollector::kMarkVisitCrossThreadPersistents); + // Lock guards against changes to {Weak}CrossThreadPersistent handles, that + // may conflict with marking. E.g., a WeakCrossThreadPersistent may be + // converted into a CrossThreadPersistent which requires that the handle + // is either cleared or the object is retained. + g_process_mutex.Pointer()->Lock(); + heap().GetStrongCrossThreadPersistentRegion().Trace(&visitor()); + visited_cross_thread_persistents_in_atomic_pause_ = true; + return (heap().GetStrongCrossThreadPersistentRegion().NodesInUse() > 0); +} + void MarkerBase::ScheduleIncrementalMarkingTask() { DCHECK(platform_); if (!foreground_task_runner_ || incremental_marking_handle_) return; @@ -400,8 +405,13 @@ bool MarkerBase::AdvanceMarkingWithLimits(v8::base::TimeDelta max_duration, heap().stats_collector(), StatsCollector::kMarkTransitiveClosureWithDeadline, "deadline_ms", max_duration.InMillisecondsF()); - is_done = ProcessWorklistsWithDeadline( - marked_bytes_limit, v8::base::TimeTicks::Now() + max_duration); + const auto deadline = v8::base::TimeTicks::Now() + max_duration; + is_done = ProcessWorklistsWithDeadline(marked_bytes_limit, deadline); + if (is_done && VisitCrossThreadPersistentsIfNeeded()) { + // Both limits are absolute and hence can be passed along without further + // adjustment. + is_done = ProcessWorklistsWithDeadline(marked_bytes_limit, deadline); + } schedule_.UpdateMutatorThreadMarkedBytes( mutator_marking_state_.marked_bytes()); } @@ -515,7 +525,7 @@ bool MarkerBase::ProcessWorklistsWithDeadline( saved_did_discover_new_ephemeron_pairs = mutator_marking_state_.DidDiscoverNewEphemeronPairs(); { - StatsCollector::EnabledScope stats_scope( + StatsCollector::EnabledScope inner_stats_scope( heap().stats_collector(), StatsCollector::kMarkProcessEphemerons); if (!DrainWorklistWithBytesAndTimeDeadline( mutator_marking_state_, marked_bytes_deadline, time_deadline, |