| 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
|
|
|