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:
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();