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