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); |
}; |