Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1436)

Unified Diff: base/memory/memory_pressure_listener.cc

Issue 17106004: Add discardable memory emulation for non-android/mac platforms (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/memory/memory_pressure_listener.cc
diff --git a/base/memory/memory_pressure_listener.cc b/base/memory/memory_pressure_listener.cc
index 911dbb38c89b86349f05aa392f4b4dfee56c3d88..76f83629c5cd5f14a7742510ce0ad321dec3d198 100644
--- a/base/memory/memory_pressure_listener.cc
+++ b/base/memory/memory_pressure_listener.cc
@@ -9,8 +9,29 @@
namespace {
-base::LazyInstance<ObserverListThreadSafe<base::MemoryPressureListener> >::Leaky
- g_observers = LAZY_INSTANCE_INITIALIZER;
+typedef
+ ObserverListThreadSafe<base::MemoryPressureListener>
+ PressureObserverList;
+
+// If the ObserverListThreadSafe<> were to be created by LazyInstance directly,
+// it would not have its refcount incremented and would be deleted as soon as
+// it tried to notify its observers. (As part of the notification process, it
+// creates closures holding scoped_refptrs to the global observer list. When
+// these closures are deleted, their scoped_refptrs get deleted and the global
+// list -- whose refcount just dropped to zero -- also gets deleted.) To avoid
+// this, we'll instead instantiate a wrapper holding a scoped_refptr to the
+// actual observer list.
+class ObserverListWrapper {
+ public:
+ ObserverListWrapper() : pressure_observers_(new PressureObserverList) {}
+ PressureObserverList& observers() { return *pressure_observers_; }
+
+ private:
+ scoped_refptr<PressureObserverList> pressure_observers_;
+};
+
+base::LazyInstance<ObserverListWrapper>::Leaky
+ g_observers_wrapper = LAZY_INSTANCE_INITIALIZER;
} // namespace
@@ -19,11 +40,11 @@ namespace base {
MemoryPressureListener::MemoryPressureListener(
const MemoryPressureListener::MemoryPressureCallback& callback)
: callback_(callback) {
- g_observers.Get().AddObserver(this);
+ g_observers_wrapper.Get().observers().AddObserver(this);
}
MemoryPressureListener::~MemoryPressureListener() {
- g_observers.Get().RemoveObserver(this);
+ g_observers_wrapper.Get().observers().RemoveObserver(this);
}
void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
@@ -33,8 +54,8 @@ void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
// static
void MemoryPressureListener::NotifyMemoryPressure(
MemoryPressureLevel memory_pressure_level) {
- g_observers.Get().Notify(&MemoryPressureListener::Notify,
- memory_pressure_level);
+ g_observers_wrapper.Get().observers().Notify(
+ &MemoryPressureListener::Notify, memory_pressure_level);
}
} // namespace base

Powered by Google App Engine
This is Rietveld 408576698