Index: base/memory/memory_pressure_listener.h |
diff --git a/base/memory/memory_pressure_listener.h b/base/memory/memory_pressure_listener.h |
index a6ce702ccb0f68df89a80b53934a884f4463926f..5308e31c152684aa8de003ff1336b411a12bfbd7 100644 |
--- a/base/memory/memory_pressure_listener.h |
+++ b/base/memory/memory_pressure_listener.h |
@@ -12,7 +12,9 @@ |
#include "base/base_export.h" |
#include "base/callback.h" |
+#include "base/lazy_instance.h" |
#include "base/macros.h" |
+#include "base/observer_list_threadsafe.h" |
namespace base { |
@@ -51,22 +53,27 @@ class BASE_EXPORT MemoryPressureListener { |
// No problems, there is enough memory to use. This event is not sent via |
// callback, but the enum is used in other places to find out the current |
// state of the system. |
- MEMORY_PRESSURE_LEVEL_NONE = -1, |
+ MEMORY_PRESSURE_LEVEL_NONE, |
// Modules are advised to free buffers that are cheap to re-allocate and not |
// immediately needed. |
- MEMORY_PRESSURE_LEVEL_MODERATE = 0, |
+ MEMORY_PRESSURE_LEVEL_MODERATE, |
// At this level, modules are advised to free all possible memory. The |
// alternative is to be killed by the system, which means all memory will |
// have to be re-created, plus the cost of a cold start. |
- MEMORY_PRESSURE_LEVEL_CRITICAL = 2, |
+ MEMORY_PRESSURE_LEVEL_CRITICAL, |
}; |
typedef base::Callback<void(MemoryPressureLevel)> MemoryPressureCallback; |
+ typedef base::Callback<void(MemoryPressureLevel)> SyncMemoryPressureCallback; |
explicit MemoryPressureListener( |
const MemoryPressureCallback& memory_pressure_callback); |
+ MemoryPressureListener( |
+ const MemoryPressureCallback& memory_pressure_callback, |
+ const SyncMemoryPressureCallback& sync_memory_pressure_callback); |
+ |
~MemoryPressureListener(); |
// Intended for use by the platform specific implementation. |
@@ -81,11 +88,38 @@ class BASE_EXPORT MemoryPressureListener { |
MemoryPressureLevel memory_pressure_level); |
private: |
+ // 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; |
+ } |
+ }; |
+ |
+ MemoryPressureListener(); |
+ |
void Notify(MemoryPressureLevel memory_pressure_level); |
+ void SyncNotify(MemoryPressureLevel memory_pressure_level); |
static void DoNotifyMemoryPressure(MemoryPressureLevel memory_pressure_level); |
MemoryPressureCallback callback_; |
+ SyncMemoryPressureCallback sync_memory_pressure_callback_; |
+ |
+ LazyInstance<ObserverListThreadSafe<MemoryPressureListener>, |
+ LeakyLazyObserverListTraits> observers_; |
+ LazyInstance<ObserverList<MemoryPressureListener>> sync_observers_; |
+ base::LazyInstance<base::Lock>::Leaky sync_observers_lock_; |
+ |
+ static MemoryPressureListener* g_listener; |
DISALLOW_COPY_AND_ASSIGN(MemoryPressureListener); |
}; |