tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 0a701bae96dfbea8212f8a34490341535f67a9f0
parent 45290297179b465ddf1a2d1cd098f3946ecb56af
Author: Jan de Mooij <jdemooij@mozilla.com>
Date:   Mon,  5 Jan 2026 16:12:23 +0000

Bug 2002938 - Start source compression tasks less eagerly on non-shrinking GCs. r=jonco

This patch changes the heuristics so that pending compression tasks are immediately
started on shrinking GCs. For non-shrinking GCs it increases the delay from `gcNumber + 1`
to `gcNumber + 3`.

This reduces the number of compression tasks and compressed script sources on a full
Speedometer 3 run, and moves more of the compression tasks to shrinking GCs.

Differential Revision: https://phabricator.services.mozilla.com/D274387

Diffstat:
Mjs/src/gc/GC.cpp | 2+-
Mjs/src/vm/HelperThreadState.h | 2+-
Mjs/src/vm/HelperThreads.cpp | 18+++++++++++-------
Mjs/src/vm/HelperThreads.h | 2+-
4 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/js/src/gc/GC.cpp b/js/src/gc/GC.cpp @@ -2895,7 +2895,7 @@ bool GCRuntime::beginPreparePhase(JS::GCReason reason, AutoGCSession& session) { * GCReason::XPCONNECT_SHUTDOWN GCs we can remove the extra check. */ if (!isShutdownGC() && reason != JS::GCReason::XPCONNECT_SHUTDOWN) { - StartOffThreadCompressionsOnGC(rt); + StartOffThreadCompressionsOnGC(rt, isShrinkingGC()); } return true; diff --git a/js/src/vm/HelperThreadState.h b/js/src/vm/HelperThreadState.h @@ -430,7 +430,7 @@ class GlobalHelperThreadState { public: // Used by a major GC to create and enqueue compression tasks. - enum class ScheduleCompressionTask { GC, API }; + enum class ScheduleCompressionTask { NonShrinkingGC, ShrinkingGC, API }; void createAndSubmitCompressionTasks(ScheduleCompressionTask schedule, JSRuntime* rt); diff --git a/js/src/vm/HelperThreads.cpp b/js/src/vm/HelperThreads.cpp @@ -1637,10 +1637,10 @@ void GlobalHelperThreadState::createAndSubmitCompressionTasks( return true; } - // If we're starting tasks on GC, we wait 2 major GCs to start compressing - // in order to avoid immediate compression. - if (schedule == ScheduleCompressionTask::GC && - rt->gc.majorGCCount() <= entry.majorGCNumber() + 1) { + // If we're starting tasks on a non-shrinking GC, we wait a few major GCs to + // start compressing in order to avoid immediate compression. + if (schedule == ScheduleCompressionTask::NonShrinkingGC && + rt->gc.majorGCCount() <= entry.majorGCNumber() + 3) { return false; } @@ -1722,9 +1722,13 @@ void GlobalHelperThreadState::runPendingSourceCompressions(JSRuntime* runtime) { AttachFinishedCompressions(runtime, lock); } -void js::StartOffThreadCompressionsOnGC(JSRuntime* runtime) { - HelperThreadState().createAndSubmitCompressionTasks( - GlobalHelperThreadState::ScheduleCompressionTask::GC, runtime); +void js::StartOffThreadCompressionsOnGC(JSRuntime* runtime, + bool isShrinkingGC) { + auto schedule = + isShrinkingGC + ? GlobalHelperThreadState::ScheduleCompressionTask::ShrinkingGC + : GlobalHelperThreadState::ScheduleCompressionTask::NonShrinkingGC; + HelperThreadState().createAndSubmitCompressionTasks(schedule, runtime); } template <typename T> diff --git a/js/src/vm/HelperThreads.h b/js/src/vm/HelperThreads.h @@ -307,7 +307,7 @@ void WaitForAllHelperThreads(AutoLockHelperThreadState& lock); // Start handling any compression tasks for this runtime. Called at the start of // major GC. -void StartOffThreadCompressionsOnGC(JSRuntime* rt); +void StartOffThreadCompressionsOnGC(JSRuntime* rt, bool isShrinkingGC); // Cancel all scheduled, in progress, or finished compression tasks for // runtime.