tor-browser

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

commit 4bea86c2ae8d0c698faa92631a396ea7131ec95f
parent 70c1ed629c2c203865009c16600e135caf16fc43
Author: agoloman <agoloman@mozilla.com>
Date:   Tue,  9 Dec 2025 10:28:44 +0200

Revert "Bug 1996828 - MemoryTelemetry doesn't need to inherrit from nsISupports r=toolkit-telemetry-reviewers,chutten" for causing mda failures @browser_encrypted_play_time_telemetry.js.

This reverts commit 4fb3fa392553cf13c6ce2e782c8549d4b2c45217.

Revert "Bug 1996828 - Move the shutdown observer into TelemetryImpl r=toolkit-telemetry-reviewers,chutten"

This reverts commit bc6ccb4c0628ba4148b39eb0da8c1c4317206906.

Revert "Bug 1996828 - Make creation of MemoryTelemetry explicit r=toolkit-telemetry-reviewers,chutten"

This reverts commit bad6494dd2179d1dbc950f6645a291737e1cb0f8.

Revert "Bug 1996828 - Use reference counting for MemoryTelemetry r=toolkit-telemetry-reviewers,chutten"

This reverts commit 0147760b374da72c6451351843ba53400d12a44a.

Diffstat:
Mjs/xpconnect/src/XPCJSContext.cpp | 5+----
Mjs/xpconnect/tests/unit/test_js_memory_telemetry.js | 6------
Mtoolkit/components/telemetry/core/Telemetry.cpp | 56++++++--------------------------------------------------
Mxpcom/base/MemoryTelemetry.cpp | 57++++++++++++++++++++++++++++++++++++++-------------------
Mxpcom/base/MemoryTelemetry.h | 18+++++++++++-------
5 files changed, 56 insertions(+), 86 deletions(-)

diff --git a/js/xpconnect/src/XPCJSContext.cpp b/js/xpconnect/src/XPCJSContext.cpp @@ -1536,10 +1536,7 @@ void XPCJSContext::AfterProcessTask(uint32_t aNewRecursionDepth) { // Poke the memory telemetry reporter if (AppShutdown::GetCurrentShutdownPhase() == ShutdownPhase::NotInShutdown) { - RefPtr<MemoryTelemetry> telemetry = MemoryTelemetry::Get(); - if (telemetry) { - telemetry->Poke(); - } + MemoryTelemetry::Get().Poke(); } // This exception might have been set if we called an XPCWrappedJS that threw, diff --git a/js/xpconnect/tests/unit/test_js_memory_telemetry.js b/js/xpconnect/tests/unit/test_js_memory_telemetry.js @@ -8,10 +8,6 @@ add_task(function test_compartment_realm_counts() { Cu.forceShrinkingGC(); - // MemoryTelemetry class needs to be created and initialised. - Services.telemetry.earlyInit(); - Services.telemetry.delayedInit(); - Services.telemetry.gatherMemory(); let snapshot1 = Services.telemetry.getSnapshotForHistograms("main", true).parent; @@ -54,6 +50,4 @@ add_task(function test_compartment_realm_counts() { "There must be more system realms than system compartments now"); arr[0].x = 10; // Ensure the JS engine keeps |arr| alive until this point. - - Services.telemetry.shutdown(); }); diff --git a/toolkit/components/telemetry/core/Telemetry.cpp b/toolkit/components/telemetry/core/Telemetry.cpp @@ -57,8 +57,6 @@ #include "nsDirectoryServiceDefs.h" #include "nsIFileStreams.h" #include "nsIMemoryReporter.h" -#include "nsIObserver.h" -#include "nsIObserverService.h" #include "nsISeekableStream.h" #include "nsITelemetry.h" #if defined(XP_WIN) @@ -112,13 +110,10 @@ void ClearIOReporting() { sTelemetryIOObserver = nullptr; } -class TelemetryImpl final : public nsITelemetry, - public nsIMemoryReporter, - public nsIObserver { +class TelemetryImpl final : public nsITelemetry, public nsIMemoryReporter { NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSITELEMETRY NS_DECL_NSIMEMORYREPORTER - NS_DECL_NSIOBSERVER public: void InitMemoryReporter(); @@ -173,7 +168,6 @@ class TelemetryImpl final : public nsITelemetry, Mutex mHashMutex MOZ_UNANNOTATED; Atomic<bool, SequentiallyConsistent> mCanRecordBase; Atomic<bool, SequentiallyConsistent> mCanRecordExtended; - RefPtr<MemoryTelemetry> mMemoryTelemetry; bool mCachedTelemetryData; uint32_t mLastShutdownTime; @@ -1024,8 +1018,6 @@ static const TrackedDBEntry kTrackedDBPrefixes[] = { #undef TRACKEDDB_ENTRY -static constexpr const char* kTopicShutdown = "content-child-shutdown"; - // Slow SQL statements will be automatically // trimmed to kMaxSlowStatementLength characters. // This limit doesn't include the ellipsis and DB name, @@ -1116,7 +1108,7 @@ bool TelemetryImpl::CanRecordReleaseData() { return CanRecordBase(); } bool TelemetryImpl::CanRecordPrereleaseData() { return CanRecordExtended(); } -NS_IMPL_ISUPPORTS(TelemetryImpl, nsITelemetry, nsIMemoryReporter, nsITelemetry) +NS_IMPL_ISUPPORTS(TelemetryImpl, nsITelemetry, nsIMemoryReporter) NS_IMETHODIMP TelemetryImpl::GetFileIOReports(JSContext* cx, @@ -1215,60 +1207,32 @@ TelemetryImpl::FlushBatchedChildTelemetry() { NS_IMETHODIMP TelemetryImpl::EarlyInit() { - if (mMemoryTelemetry) { - // Don't do anything if EarlyInit ran already. - return NS_OK; - } - mMemoryTelemetry = MemoryTelemetry::Create(); - MOZ_ASSERT(mMemoryTelemetry); - - if (XRE_IsContentProcess()) { - nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); - MOZ_RELEASE_ASSERT(obs); - - obs->AddObserver(this, kTopicShutdown, true); - } + (void)MemoryTelemetry::Get(); return NS_OK; } NS_IMETHODIMP TelemetryImpl::DelayedInit() { - if (!mMemoryTelemetry) { - return NS_ERROR_FAILURE; - } - mMemoryTelemetry->DelayedInit(); + MemoryTelemetry::Get().DelayedInit(); return NS_OK; } NS_IMETHODIMP TelemetryImpl::Shutdown() { - nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); - MOZ_RELEASE_ASSERT(obs); - obs->RemoveObserver(this, kTopicShutdown); - - if (!mMemoryTelemetry) { - return NS_ERROR_FAILURE; - } - - mMemoryTelemetry->Shutdown(); - mMemoryTelemetry = nullptr; + MemoryTelemetry::Get().Shutdown(); return NS_OK; } NS_IMETHODIMP TelemetryImpl::GatherMemory(JSContext* aCx, Promise** aResult) { - if (!mMemoryTelemetry) { - return NS_ERROR_FAILURE; - } - ErrorResult rv; RefPtr<Promise> promise = Promise::Create(xpc::CurrentNativeGlobal(aCx), rv); if (rv.Failed()) { return rv.StealNSResult(); } - mMemoryTelemetry->GatherReports( + MemoryTelemetry::Get().GatherReports( [promise]() { promise->MaybeResolve(JS::UndefinedHandleValue); }); promise.forget(aResult); @@ -1313,14 +1277,6 @@ TelemetryImpl::GetAllStores(JSContext* aCx, return NS_OK; } -nsresult TelemetryImpl::Observe(nsISupports* aSubject, const char* aTopic, - const char16_t* aData) { - if (strcmp(aTopic, kTopicShutdown) == 0) { - FlushBatchedChildTelemetry(); - } - return NS_OK; -} - } // namespace //////////////////////////////////////////////////////////////////////// diff --git a/xpcom/base/MemoryTelemetry.cpp b/xpcom/base/MemoryTelemetry.cpp @@ -30,6 +30,7 @@ #include "nsImportModule.h" #include "nsITelemetry.h" #include "nsNetCID.h" +#include "nsObserverService.h" #include "nsReadableUtils.h" #include "nsThreadUtils.h" #include "nsXULAppAPI.h" @@ -55,6 +56,8 @@ static constexpr uint32_t kTelemetryCooldownS = 10; static constexpr unsigned kPokeWindowEvents = 10; static constexpr unsigned kPokeWindowSeconds = 1; +static constexpr const char* kTopicShutdown = "content-child-shutdown"; + namespace { enum class PrevValue : uint32_t { @@ -116,31 +119,35 @@ class TimeStampWindow { AutoCleanLinkedList<Event> mEvents; }; +NS_IMPL_ISUPPORTS(MemoryTelemetry, nsIObserver, nsISupportsWeakReference) + MemoryTelemetry::MemoryTelemetry() - : mThreadPool(do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID)) { + : mThreadPool(do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID)) {} + +void MemoryTelemetry::Init() { for (auto& val : gPrevValues) { val = kUninitialized; } -} -MemoryTelemetry::~MemoryTelemetry() {} + if (XRE_IsContentProcess()) { + nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); + MOZ_RELEASE_ASSERT(obs); -static StaticRefPtr<MemoryTelemetry> sInstance; + obs->AddObserver(this, kTopicShutdown, true); + } +} + +/* static */ MemoryTelemetry& MemoryTelemetry::Get() { + static RefPtr<MemoryTelemetry> sInstance; -/* static */ RefPtr<MemoryTelemetry> MemoryTelemetry::Create() { MOZ_ASSERT(NS_IsMainThread()); if (!sInstance) { sInstance = new MemoryTelemetry(); + sInstance->Init(); ClearOnShutdown(&sInstance); } - - return sInstance; -} - -/* static */ RefPtr<MemoryTelemetry> MemoryTelemetry::Get() { - MOZ_ASSERT(NS_IsMainThread()); - return sInstance; + return *sInstance; } void MemoryTelemetry::DelayedInit() { @@ -223,7 +230,10 @@ nsresult MemoryTelemetry::Shutdown() { mTimer->Cancel(); } - sInstance = nullptr; + nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); + MOZ_RELEASE_ASSERT(obs); + + obs->RemoveObserver(this, kTopicShutdown); return NS_OK; } @@ -432,10 +442,8 @@ void MemoryTelemetry::GatherTotalMemory() { infos.AppendElement(info); }); - RefPtr<MemoryTelemetry> self = this; mThreadPool->Dispatch(NS_NewRunnableFunction( - "MemoryTelemetry::GatherTotalMemory", - [self = std::move(self), infos = std::move(infos)] { + "MemoryTelemetry::GatherTotalMemory", [infos = std::move(infos)] { RefPtr<nsMemoryReporterManager> mgr = nsMemoryReporterManager::GetOrCreate(); MOZ_RELEASE_ASSERT(mgr); @@ -477,9 +485,9 @@ void MemoryTelemetry::GatherTotalMemory() { NS_DispatchToMainThread(NS_NewRunnableFunction( "MemoryTelemetry::FinishGatheringTotalMemory", - [self = std::move(self), mbTotal, - childSizes = std::move(childSizes)] { - self->FinishGatheringTotalMemory(mbTotal, childSizes); + [mbTotal, childSizes = std::move(childSizes)] { + MemoryTelemetry::Get().FinishGatheringTotalMemory(mbTotal, + childSizes); })); })); } @@ -569,3 +577,14 @@ nsresult MemoryTelemetry::FinishGatheringTotalMemory( return total; } + +nsresult MemoryTelemetry::Observe(nsISupports* aSubject, const char* aTopic, + const char16_t* aData) { + if (strcmp(aTopic, kTopicShutdown) == 0) { + if (nsCOMPtr<nsITelemetry> telemetry = + do_GetService("@mozilla.org/base/telemetry;1")) { + telemetry->FlushBatchedChildTelemetry(); + } + } + return NS_OK; +} diff --git a/xpcom/base/MemoryTelemetry.h b/xpcom/base/MemoryTelemetry.h @@ -10,8 +10,10 @@ #include "mozilla/TimeStamp.h" #include "mozilla/Maybe.h" #include "mozilla/Result.h" +#include "nsIObserver.h" #include "nsITimer.h" #include "nsTArray.h" +#include "nsWeakReference.h" #include <functional> @@ -29,14 +31,13 @@ enum class ResponseRejectReason; * Periodically gathers memory usage metrics after cycle collection, and * populates telemetry histograms with their values. */ -class MemoryTelemetry final { +class MemoryTelemetry final : public nsIObserver, + public nsSupportsWeakReference { public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MemoryTelemetry) + NS_DECL_ISUPPORTS + NS_DECL_NSIOBSERVER - static RefPtr<MemoryTelemetry> Create(); - - // May return null if instance hasn't been created or was destroyed. - static RefPtr<MemoryTelemetry> Get(); + static MemoryTelemetry& Get(); nsresult GatherReports( const std::function<void()>& aCompletionCallback = nullptr); @@ -55,7 +56,10 @@ class MemoryTelemetry final { private: MemoryTelemetry(); - ~MemoryTelemetry(); + + ~MemoryTelemetry() = default; + + void Init(); static Result<uint32_t, nsresult> GetOpenTabsCount();