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..2c437c8e3bbce9ed7ac5f640d7e634272111ba63 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 { |
| @@ -45,6 +47,29 @@ namespace base { |
| // |
| class BASE_EXPORT MemoryPressureListener { |
| public: |
| + // ObserverListThreadSafe is RefCountedThreadSafe, this traits is needed |
|
esprehn
2016/03/25 09:20:35
Why does this all need to be moved into the header
hong.zheng
2016/04/01 09:22:34
According to Mark's comments
|
| + // 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; |
| + } |
| + }; |
| + |
| + struct MemoryPressureListenerObservers { |
| + LazyInstance<ObserverListThreadSafe<MemoryPressureListener>, |
| + LeakyLazyObserverListTraits> observers_; |
| + LazyInstance<ObserverList<MemoryPressureListener>> sync_observers_; |
| + base::LazyInstance<base::Lock>::Leaky sync_observers_lock_; |
| + }; |
| + |
| // A Java counterpart will be generated for this enum. |
| // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base |
| enum MemoryPressureLevel { |
| @@ -64,9 +89,14 @@ class BASE_EXPORT MemoryPressureListener { |
| }; |
| typedef base::Callback<void(MemoryPressureLevel)> MemoryPressureCallback; |
| + typedef base::Callback<void(MemoryPressureLevel)> SyncMemoryPressureCallback; |
| explicit MemoryPressureListener( |
| const MemoryPressureCallback& memory_pressure_callback); |
| + explicit MemoryPressureListener( |
| + const MemoryPressureCallback& memory_pressure_callback, |
| + const SyncMemoryPressureCallback& sync_memory_pressure_callback); |
| + |
| ~MemoryPressureListener(); |
| // Intended for use by the platform specific implementation. |
| @@ -82,10 +112,14 @@ class BASE_EXPORT MemoryPressureListener { |
| private: |
| 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_; |
| + |
| + static MemoryPressureListenerObservers* g_observers; |
|
esprehn
2016/03/25 09:20:35
why does this need to be moved into the header?
Mark Mentovai
2016/03/25 16:59:31
esprehn wrote:
hong.zheng
2016/04/01 09:22:34
I am sorry to misunderstand Mark's comments before
|
| DISALLOW_COPY_AND_ASSIGN(MemoryPressureListener); |
| }; |