summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/cppgc/marker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/cppgc/marker.cc')
-rw-r--r--deps/v8/src/heap/cppgc/marker.cc46
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,