tor-browser

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

commit bc6ccb4c0628ba4148b39eb0da8c1c4317206906
parent bad6494dd2179d1dbc950f6645a291737e1cb0f8
Author: Paul Bone <paul@bone.id.au>
Date:   Tue,  9 Dec 2025 03:12:40 +0000

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

This shutdown observer flushes telemetry from content processes during
shutdown.  It may have been created for memory telemetry but it's more
general.

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

Diffstat:
Mtoolkit/components/telemetry/core/Telemetry.cpp | 32++++++++++++++++++++++++++++++--
Mxpcom/base/MemoryTelemetry.cpp | 33++-------------------------------
Mxpcom/base/MemoryTelemetry.h | 7+------
3 files changed, 33 insertions(+), 39 deletions(-)

diff --git a/toolkit/components/telemetry/core/Telemetry.cpp b/toolkit/components/telemetry/core/Telemetry.cpp @@ -57,6 +57,8 @@ #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) @@ -110,10 +112,13 @@ void ClearIOReporting() { sTelemetryIOObserver = nullptr; } -class TelemetryImpl final : public nsITelemetry, public nsIMemoryReporter { +class TelemetryImpl final : public nsITelemetry, + public nsIMemoryReporter, + public nsIObserver { NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSITELEMETRY NS_DECL_NSIMEMORYREPORTER + NS_DECL_NSIOBSERVER public: void InitMemoryReporter(); @@ -1019,6 +1024,8 @@ 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, @@ -1109,7 +1116,7 @@ bool TelemetryImpl::CanRecordReleaseData() { return CanRecordBase(); } bool TelemetryImpl::CanRecordPrereleaseData() { return CanRecordExtended(); } -NS_IMPL_ISUPPORTS(TelemetryImpl, nsITelemetry, nsIMemoryReporter) +NS_IMPL_ISUPPORTS(TelemetryImpl, nsITelemetry, nsIMemoryReporter, nsITelemetry) NS_IMETHODIMP TelemetryImpl::GetFileIOReports(JSContext* cx, @@ -1214,6 +1221,14 @@ TelemetryImpl::EarlyInit() { } mMemoryTelemetry = MemoryTelemetry::Create(); MOZ_ASSERT(mMemoryTelemetry); + + if (XRE_IsContentProcess()) { + nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); + MOZ_RELEASE_ASSERT(obs); + + obs->AddObserver(this, kTopicShutdown, true); + } + return NS_OK; } @@ -1228,9 +1243,14 @@ TelemetryImpl::DelayedInit() { 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; return NS_OK; @@ -1293,6 +1313,14 @@ 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,7 +30,6 @@ #include "nsImportModule.h" #include "nsITelemetry.h" #include "nsNetCID.h" -#include "nsObserverService.h" #include "nsReadableUtils.h" #include "nsThreadUtils.h" #include "nsXULAppAPI.h" @@ -56,8 +55,6 @@ 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 { @@ -119,22 +116,13 @@ class TimeStampWindow { AutoCleanLinkedList<Event> mEvents; }; -NS_IMPL_ISUPPORTS(MemoryTelemetry, nsIObserver, nsISupportsWeakReference) +NS_IMPL_ISUPPORTS(MemoryTelemetry, nsISupportsWeakReference) MemoryTelemetry::MemoryTelemetry() - : mThreadPool(do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID)) {} - -void MemoryTelemetry::Init() { + : mThreadPool(do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID)) { for (auto& val : gPrevValues) { val = kUninitialized; } - - if (XRE_IsContentProcess()) { - nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); - MOZ_RELEASE_ASSERT(obs); - - obs->AddObserver(this, kTopicShutdown, true); - } } static StaticRefPtr<MemoryTelemetry> sInstance; @@ -144,7 +132,6 @@ static StaticRefPtr<MemoryTelemetry> sInstance; if (!sInstance) { sInstance = new MemoryTelemetry(); - sInstance->Init(); ClearOnShutdown(&sInstance); } @@ -236,11 +223,6 @@ nsresult MemoryTelemetry::Shutdown() { mTimer->Cancel(); } - nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); - MOZ_RELEASE_ASSERT(obs); - - obs->RemoveObserver(this, kTopicShutdown); - sInstance = nullptr; return NS_OK; @@ -587,14 +569,3 @@ 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,7 +10,6 @@ #include "mozilla/TimeStamp.h" #include "mozilla/Maybe.h" #include "mozilla/Result.h" -#include "nsIObserver.h" #include "nsITimer.h" #include "nsTArray.h" #include "nsWeakReference.h" @@ -31,11 +30,9 @@ enum class ResponseRejectReason; * Periodically gathers memory usage metrics after cycle collection, and * populates telemetry histograms with their values. */ -class MemoryTelemetry final : public nsIObserver, - public nsSupportsWeakReference { +class MemoryTelemetry final : public nsSupportsWeakReference { public: NS_DECL_THREADSAFE_ISUPPORTS - NS_DECL_NSIOBSERVER static RefPtr<MemoryTelemetry> Create(); @@ -62,8 +59,6 @@ class MemoryTelemetry final : public nsIObserver, ~MemoryTelemetry() = default; - void Init(); - static Result<uint32_t, nsresult> GetOpenTabsCount(); void GatherTotalMemory();