Chromium Code Reviews| 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..02a58cba946b6d5bd32b89ca4bdaf1476a52fa14 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); |
| + explicit MemoryPressureListener( |
|
kinuko
2016/04/11 09:30:40
nit: no need of explicit here
hong.zheng
2016/04/15 06:05:57
Done.
|
| + 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); |
| }; |