Bug 830125 - Add the preferences memory reporter off a runnable, so as to avoid recursive GetService calls. r=njn

This commit is contained in:
Justin Lebar 2013-01-14 01:43:25 -05:00
Родитель eec2430465
Коммит e34f230a7f
1 изменённых файлов: 21 добавлений и 2 удалений

Просмотреть файл

@ -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<nsIMemoryReporter> 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<ValueObserverHashKey, ValueObserver>();
gObserverTable->Init();
nsCOMPtr<nsIMemoryReporter> 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<AddPreferencesMemoryReporterRunnable> runnable =
new AddPreferencesMemoryReporterRunnable();
NS_DispatchToMainThread(runnable);
NS_ADDREF(sPreferences);
return sPreferences;