From 09be4479dbb9ecd6f869473810e706a97065463a Mon Sep 17 00:00:00 2001 From: Gabriele Svelto Date: Wed, 13 Mar 2013 12:24:04 +0100 Subject: [PATCH] Bug 850607 - Properly react to changes to the 'memory.free_dirty_pages' preference. r=jlebar --- xpcom/base/AvailableMemoryTracker.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/xpcom/base/AvailableMemoryTracker.cpp b/xpcom/base/AvailableMemoryTracker.cpp index eb465f44ea8..7f248a06e53 100644 --- a/xpcom/base/AvailableMemoryTracker.cpp +++ b/xpcom/base/AvailableMemoryTracker.cpp @@ -517,10 +517,15 @@ public: NS_DECL_NSIOBSERVER void Init(); + +private: + static bool sFreeDirtyPages; }; NS_IMPL_ISUPPORTS1(nsMemoryPressureWatcher, nsIObserver) +bool nsMemoryPressureWatcher::sFreeDirtyPages = false; + /** * Initialize and subscribe to the memory-pressure events. We subscribe to the * observer service in this method and not in the constructor because we need @@ -534,12 +539,14 @@ nsMemoryPressureWatcher::Init() if (os) { os->AddObserver(this, "memory-pressure", /* ownsWeak */ false); } + + Preferences::AddBoolVarCache(&sFreeDirtyPages, "memory.free_dirty_pages", + false); } /** * Reacts to all types of memory-pressure events, launches a runnable to * free dirty pages held by jemalloc. - * @see nsMemoryPressureWatcher::FreeDirtyPages */ NS_IMETHODIMP nsMemoryPressureWatcher::Observe(nsISupports *subject, const char *topic, @@ -547,9 +554,11 @@ nsMemoryPressureWatcher::Observe(nsISupports *subject, const char *topic, { MOZ_ASSERT(!strcmp(topic, "memory-pressure"), "Unknown topic"); - nsRefPtr runnable = new nsJemallocFreeDirtyPagesRunnable(); + if (sFreeDirtyPages) { + nsRefPtr runnable = new nsJemallocFreeDirtyPagesRunnable(); - NS_DispatchToMainThread(runnable); + NS_DispatchToMainThread(runnable); + } return NS_OK; } @@ -590,11 +599,9 @@ void Activate() sHooksActive = true; #endif - if (Preferences::GetBool("memory.free_dirty_pages", false)) { - // This object is held alive by the observer service. - nsRefPtr watcher = new nsMemoryPressureWatcher(); - watcher->Init(); - } + // This object is held alive by the observer service. + nsRefPtr watcher = new nsMemoryPressureWatcher(); + watcher->Init(); } void Init()