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 |