From 9fc3fa7cb4d7ac0fb979c8bcbe7f273a722536fa Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Tue, 18 Aug 2020 16:12:55 +0000 Subject: [PATCH] Bug 1659477 - Replace sweepMarkTaskStarted field by using sweepMarkTask state r=sfink Depends on D87293 Differential Revision: https://phabricator.services.mozilla.com/D87294 --- js/src/gc/GC.cpp | 30 +++++++++++++++++------------- js/src/gc/GCRuntime.h | 1 - 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/js/src/gc/GC.cpp b/js/src/gc/GC.cpp index bbde127fa72b..347a396902dd 100644 --- a/js/src/gc/GC.cpp +++ b/js/src/gc/GC.cpp @@ -910,7 +910,6 @@ GCRuntime::GCRuntime(JSRuntime* rt) sweepZone(nullptr), hasMarkedGrayRoots(false), abortSweepAfterCurrentGroup(false), - sweepMarkTaskStarted(false), sweepMarkResult(IncrementalProgress::NotFinished), startedCompacting(false), relocatedArenasToRelease(nullptr), @@ -5543,7 +5542,9 @@ IncrementalProgress GCRuntime::endSweepingSweepGroup(JSFreeOp* fop, IncrementalProgress GCRuntime::markDuringSweeping(JSFreeOp* fop, SliceBudget& budget) { - if (sweepMarkTaskStarted || marker.isDrained()) { + MOZ_ASSERT(sweepMarkTask.isIdle()); + + if (marker.isDrained()) { return Finished; } @@ -5552,7 +5553,6 @@ IncrementalProgress GCRuntime::markDuringSweeping(JSFreeOp* fop, MOZ_ASSERT(sweepMarkTask.isIdle(lock)); sweepMarkTask.setBudget(budget); sweepMarkTask.startOrRunIfIdle(lock); - sweepMarkTaskStarted = true; return Finished; // This means don't yield to the mutator here. } @@ -5633,12 +5633,15 @@ void js::gc::SweepMarkTask::run() { } IncrementalProgress GCRuntime::joinSweepMarkTask() { - MOZ_ASSERT_IF(!sweepMarkTaskStarted, sweepMarkTask.isIdle()); - joinTask(sweepMarkTask, gcstats::PhaseKind::SWEEP_MARK); + AutoLockHelperThreadState lock; + if (sweepMarkTask.isIdle(lock)) { + return Finished; + } - IncrementalProgress result = - sweepMarkTaskStarted ? sweepMarkResult : Finished; - sweepMarkTaskStarted = false; + joinTask(sweepMarkTask, gcstats::PhaseKind::SWEEP_MARK, lock); + + IncrementalProgress result = sweepMarkResult; + sweepMarkResult = Finished; return result; } @@ -6254,14 +6257,15 @@ IncrementalProgress GCRuntime::performSweepActions(SliceBudget& budget) { // Then continue running sweep actions. SweepAction::Args args{this, &fop, budget}; - IncrementalProgress progress = sweepActions->run(args); + IncrementalProgress sweepProgress = sweepActions->run(args); + IncrementalProgress markProgress = joinSweepMarkTask(); - if (sweepMarkTaskStarted && joinSweepMarkTask() == NotFinished) { - progress = NotFinished; + if (sweepProgress == Finished && markProgress == Finished) { + return Finished; } - MOZ_ASSERT_IF(progress == NotFinished, isIncremental); - return progress; + MOZ_ASSERT(isIncremental); + return NotFinished; } bool GCRuntime::allCCVisibleZonesWereCollected() { diff --git a/js/src/gc/GCRuntime.h b/js/src/gc/GCRuntime.h index e0476e3b7057..0d6bff8f0044 100644 --- a/js/src/gc/GCRuntime.h +++ b/js/src/gc/GCRuntime.h @@ -1035,7 +1035,6 @@ class GCRuntime { weakCachesToSweep; MainThreadData hasMarkedGrayRoots; MainThreadData abortSweepAfterCurrentGroup; - MainThreadData sweepMarkTaskStarted; MainThreadOrGCTaskData sweepMarkResult; #ifdef DEBUG