From 72b45daca599774d4e570f64bc202cb7141180fc Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Mon, 20 Nov 2023 16:27:28 +0000 Subject: [PATCH] Bug 1865076 - Part 3: Don't clear slice budget's interrupt word when interrupt detected r=sfink This still records that the budget has been interrupted in case the interrupt word changes later, but it doesn't change itself. Instead we have to clear it when setting up the budget in CCGCScheduler. This fixes the observed problem of slices some marking threads running much longer than others when parallel marking is enabled. Differential Revision: https://phabricator.services.mozilla.com/D193797 --- dom/base/CCGCScheduler.h | 1 + js/src/gc/GC.cpp | 1 - js/src/jsapi-tests/testSliceBudget.cpp | 9 ++++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dom/base/CCGCScheduler.h b/dom/base/CCGCScheduler.h index a05504a1f8f0..46798818da8f 100644 --- a/dom/base/CCGCScheduler.h +++ b/dom/base/CCGCScheduler.h @@ -177,6 +177,7 @@ class CCGCScheduler { js::SliceBudget CreateGCSliceBudget(mozilla::TimeDuration aDuration, bool isIdle, bool isExtended) { + mInterruptRequested = false; auto budget = js::SliceBudget(aDuration, &mInterruptRequested); budget.idle = isIdle; budget.extended = isExtended; diff --git a/js/src/gc/GC.cpp b/js/src/gc/GC.cpp index 79f8fcf1c8be..dc8299633924 100644 --- a/js/src/gc/GC.cpp +++ b/js/src/gc/GC.cpp @@ -1658,7 +1658,6 @@ bool SliceBudget::checkOverBudget() { } if (interruptRequested && *interruptRequested) { - *interruptRequested = false; interrupted = true; } diff --git a/js/src/jsapi-tests/testSliceBudget.cpp b/js/src/jsapi-tests/testSliceBudget.cpp index a53d98628d53..f73e1c8bebe5 100644 --- a/js/src/jsapi-tests/testSliceBudget.cpp +++ b/js/src/jsapi-tests/testSliceBudget.cpp @@ -104,10 +104,13 @@ BEGIN_TEST(testSliceBudgetInterruptibleTime) { // Do enough work for an expensive check. budget.step(1000); - // Interrupt requested! This will reset the external flag, but internally - // remember that an interrupt was requested. + // Interrupt requested! CHECK(budget.isOverBudget()); - CHECK(!wantInterrupt); + + // The external flag is not reset, but the budget will internally remember + // that an interrupt was requested. + CHECK(wantInterrupt); + wantInterrupt = false; CHECK(budget.isOverBudget()); // This doesn't test the deadline is correct as that would require waiting. -- 2.11.4.GIT