Index: base/memory/memory_pressure_listener.cc |
diff --git a/base/memory/memory_pressure_listener.cc b/base/memory/memory_pressure_listener.cc |
index de63958b929edf86bd61f54be7d5e387129157f3..652fbd784c7243ef6c7bd0fc06110c09d609d149 100644 |
--- a/base/memory/memory_pressure_listener.cc |
+++ b/base/memory/memory_pressure_listener.cc |
@@ -4,54 +4,59 @@ |
#include "base/memory/memory_pressure_listener.h" |
-#include "base/lazy_instance.h" |
-#include "base/observer_list_threadsafe.h" |
#include "base/trace_event/trace_event.h" |
namespace base { |
namespace { |
-// ObserverListThreadSafe is RefCountedThreadSafe, this traits is needed |
-// to ensure the LazyInstance will hold a reference to it. |
-struct LeakyLazyObserverListTraits : |
- base::internal::LeakyLazyInstanceTraits< |
- ObserverListThreadSafe<MemoryPressureListener> > { |
- static ObserverListThreadSafe<MemoryPressureListener>* |
- New(void* instance) { |
- ObserverListThreadSafe<MemoryPressureListener>* ret = |
- base::internal::LeakyLazyInstanceTraits< |
- ObserverListThreadSafe<MemoryPressureListener>>::New(instance); |
- // Leaky. |
- ret->AddRef(); |
- return ret; |
- } |
-}; |
- |
-LazyInstance< |
- ObserverListThreadSafe<MemoryPressureListener>, |
- LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER; |
- |
-// All memory pressure notifications within this process will be suppressed if |
-// this variable is set to 1. |
subtle::Atomic32 g_notifications_suppressed = 0; |
} // namespace |
+//static |
+MemoryPressureListener* MemoryPressureListener::g_listener = |
+ new MemoryPressureListener(); |
Mark Mentovai
2016/04/20 13:21:33
This results in a module initializer. Can’t do tha
hong.zheng
2016/04/21 12:18:04
Done.
|
+ |
+MemoryPressureListener::MemoryPressureListener() |
+ : observers_(LAZY_INSTANCE_INITIALIZER), |
+ sync_observers_(LAZY_INSTANCE_INITIALIZER), |
+ sync_observers_lock_(LAZY_INSTANCE_INITIALIZER) {} |
+ |
MemoryPressureListener::MemoryPressureListener( |
const MemoryPressureListener::MemoryPressureCallback& callback) |
: callback_(callback) { |
- g_observers.Get().AddObserver(this); |
+ g_listener->observers_.Get().AddObserver(this); |
+} |
+ |
+MemoryPressureListener::MemoryPressureListener( |
+ const MemoryPressureListener::MemoryPressureCallback& callback, |
+ const MemoryPressureListener::SyncMemoryPressureCallback& |
+ sync_memory_pressure_callback) |
+ : callback_(callback), |
+ sync_memory_pressure_callback_(sync_memory_pressure_callback) { |
+ g_listener->observers_.Get().AddObserver(this); |
+ base::AutoLock lock(g_listener->sync_observers_lock_.Get()); |
+ g_listener->sync_observers_.Get().AddObserver(this); |
} |
MemoryPressureListener::~MemoryPressureListener() { |
- g_observers.Get().RemoveObserver(this); |
+ g_listener->observers_.Get().RemoveObserver(this); |
+ base::AutoLock lock(g_listener->sync_observers_lock_.Get()); |
+ g_listener->sync_observers_.Get().RemoveObserver(this); |
} |
void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { |
callback_.Run(memory_pressure_level); |
} |
+void MemoryPressureListener::SyncNotify( |
+ MemoryPressureLevel memory_pressure_level) { |
+ if (!sync_memory_pressure_callback_.is_null()) { |
+ sync_memory_pressure_callback_.Run(memory_pressure_level); |
+ } |
+} |
+ |
// static |
void MemoryPressureListener::NotifyMemoryPressure( |
MemoryPressureLevel memory_pressure_level) { |
@@ -86,8 +91,13 @@ void MemoryPressureListener::SimulatePressureNotification( |
void MemoryPressureListener::DoNotifyMemoryPressure( |
MemoryPressureLevel memory_pressure_level) { |
DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); |
- g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify, |
- memory_pressure_level); |
+ |
+ g_listener->observers_.Get().Notify(FROM_HERE, |
+ &MemoryPressureListener::Notify, memory_pressure_level); |
+ base::AutoLock lock(g_listener->sync_observers_lock_.Get()); |
+ FOR_EACH_OBSERVER( |
+ MemoryPressureListener, g_listener->sync_observers_.Get(), |
+ SyncNotify(memory_pressure_level)); |
} |
} // namespace base |