From e34f230a7ff45181b818184886a5dc6d5ecc8e3a Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Mon, 14 Jan 2013 01:43:25 -0500 Subject: [PATCH] Bug 830125 - Add the preferences memory reporter off a runnable, so as to avoid recursive GetService calls. r=njn --- modules/libpref/src/Preferences.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferences.cpp index d434fd3e1bd3..d9acb07ff459 100644 --- a/modules/libpref/src/Preferences.cpp +++ b/modules/libpref/src/Preferences.cpp @@ -177,6 +177,8 @@ SizeOfObserverEntryExcludingThis(ValueObserverHashKey* aKey, int64_t Preferences::GetPreferencesMemoryUsed() { + NS_ENSURE_TRUE(InitStaticMembers(), 0); + size_t n = 0; n += PreferencesMallocSizeOf(sPreferences); if (gHashTable.ops) { @@ -209,6 +211,18 @@ NS_MEMORY_REPORTER_IMPLEMENT(Preferences, Preferences::GetPreferencesMemoryUsed, "Memory used by the preferences system.") +namespace { +class AddPreferencesMemoryReporterRunnable : public nsRunnable +{ + NS_IMETHOD Run() + { + nsCOMPtr reporter = + new NS_MEMORY_REPORTER_NAME(Preferences); + return NS_RegisterMemoryReporter(reporter); + } +}; +} // anonymous namespace + // static Preferences* Preferences::GetInstanceForService() @@ -239,8 +253,13 @@ Preferences::GetInstanceForService() gObserverTable = new nsRefPtrHashtable(); gObserverTable->Init(); - nsCOMPtr reporter(new NS_MEMORY_REPORTER_NAME(Preferences)); - NS_RegisterMemoryReporter(reporter); + // Preferences;:GetInstanceForService() can be called from GetService(), and + // NS_RegisterMemoryReporter calls GetService(nsIMemoryReporter). To avoid a + // potential recursive GetService() call, we can't register the memory + // reporter here; instead, do it off a runnable. + nsRefPtr runnable = + new AddPreferencesMemoryReporterRunnable(); + NS_DispatchToMainThread(runnable); NS_ADDREF(sPreferences); return sPreferences;