| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/memory/memory_pressure_listener.h" | 5 #include "base/memory/memory_pressure_listener.h" |
| 6 | 6 |
| 7 #include "base/lazy_instance.h" | |
| 8 #include "base/observer_list_threadsafe.h" | 7 #include "base/observer_list_threadsafe.h" |
| 9 #include "base/trace_event/trace_event.h" | 8 #include "base/trace_event/trace_event.h" |
| 10 | 9 |
| 11 namespace base { | 10 namespace base { |
| 12 | 11 |
| 13 namespace { | 12 namespace { |
| 14 | 13 |
| 15 class MemoryPressureObserver { | 14 class MemoryPressureObserver { |
| 16 public: | 15 public: |
| 17 MemoryPressureObserver() | 16 MemoryPressureObserver() |
| (...skipping 26 matching lines...) Expand all Loading... |
| 44 | 43 |
| 45 private: | 44 private: |
| 46 scoped_refptr<ObserverListThreadSafe<MemoryPressureListener>> | 45 scoped_refptr<ObserverListThreadSafe<MemoryPressureListener>> |
| 47 async_observers_; | 46 async_observers_; |
| 48 ObserverList<MemoryPressureListener>* sync_observers_; | 47 ObserverList<MemoryPressureListener>* sync_observers_; |
| 49 Lock sync_observers_lock_; | 48 Lock sync_observers_lock_; |
| 50 | 49 |
| 51 DISALLOW_COPY_AND_ASSIGN(MemoryPressureObserver); | 50 DISALLOW_COPY_AND_ASSIGN(MemoryPressureObserver); |
| 52 }; | 51 }; |
| 53 | 52 |
| 54 LazyInstance<MemoryPressureObserver>::Leaky g_observer = | 53 MemoryPressureObserver* GetMemoryPressureObserver() { |
| 55 LAZY_INSTANCE_INITIALIZER; | 54 static auto observer = new MemoryPressureObserver(); |
| 55 return observer; |
| 56 } |
| 56 | 57 |
| 57 subtle::Atomic32 g_notifications_suppressed = 0; | 58 subtle::Atomic32 g_notifications_suppressed = 0; |
| 58 | 59 |
| 59 } // namespace | 60 } // namespace |
| 60 | 61 |
| 61 MemoryPressureListener::MemoryPressureListener( | 62 MemoryPressureListener::MemoryPressureListener( |
| 62 const MemoryPressureListener::MemoryPressureCallback& callback) | 63 const MemoryPressureListener::MemoryPressureCallback& callback) |
| 63 : callback_(callback) { | 64 : callback_(callback) { |
| 64 g_observer.Get().AddObserver(this, false); | 65 GetMemoryPressureObserver()->AddObserver(this, false); |
| 65 } | 66 } |
| 66 | 67 |
| 67 MemoryPressureListener::MemoryPressureListener( | 68 MemoryPressureListener::MemoryPressureListener( |
| 68 const MemoryPressureListener::MemoryPressureCallback& callback, | 69 const MemoryPressureListener::MemoryPressureCallback& callback, |
| 69 const MemoryPressureListener::SyncMemoryPressureCallback& | 70 const MemoryPressureListener::SyncMemoryPressureCallback& |
| 70 sync_memory_pressure_callback) | 71 sync_memory_pressure_callback) |
| 71 : callback_(callback), | 72 : callback_(callback), |
| 72 sync_memory_pressure_callback_(sync_memory_pressure_callback) { | 73 sync_memory_pressure_callback_(sync_memory_pressure_callback) { |
| 73 g_observer.Get().AddObserver(this, true); | 74 GetMemoryPressureObserver()->AddObserver(this, true); |
| 74 } | 75 } |
| 75 | 76 |
| 76 MemoryPressureListener::~MemoryPressureListener() { | 77 MemoryPressureListener::~MemoryPressureListener() { |
| 77 g_observer.Get().RemoveObserver(this); | 78 GetMemoryPressureObserver()->RemoveObserver(this); |
| 78 } | 79 } |
| 79 | 80 |
| 80 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { | 81 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { |
| 81 callback_.Run(memory_pressure_level); | 82 callback_.Run(memory_pressure_level); |
| 82 } | 83 } |
| 83 | 84 |
| 84 void MemoryPressureListener::SyncNotify( | 85 void MemoryPressureListener::SyncNotify( |
| 85 MemoryPressureLevel memory_pressure_level) { | 86 MemoryPressureLevel memory_pressure_level) { |
| 86 if (!sync_memory_pressure_callback_.is_null()) { | 87 if (!sync_memory_pressure_callback_.is_null()) { |
| 87 sync_memory_pressure_callback_.Run(memory_pressure_level); | 88 sync_memory_pressure_callback_.Run(memory_pressure_level); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 116 MemoryPressureLevel memory_pressure_level) { | 117 MemoryPressureLevel memory_pressure_level) { |
| 117 // Notify all listeners even if regular pressure notifications are suppressed. | 118 // Notify all listeners even if regular pressure notifications are suppressed. |
| 118 DoNotifyMemoryPressure(memory_pressure_level); | 119 DoNotifyMemoryPressure(memory_pressure_level); |
| 119 } | 120 } |
| 120 | 121 |
| 121 // static | 122 // static |
| 122 void MemoryPressureListener::DoNotifyMemoryPressure( | 123 void MemoryPressureListener::DoNotifyMemoryPressure( |
| 123 MemoryPressureLevel memory_pressure_level) { | 124 MemoryPressureLevel memory_pressure_level) { |
| 124 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); | 125 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); |
| 125 | 126 |
| 126 g_observer.Get().Notify(memory_pressure_level); | 127 GetMemoryPressureObserver()->Notify(memory_pressure_level); |
| 127 } | 128 } |
| 128 | 129 |
| 129 } // namespace base | 130 } // namespace base |
| OLD | NEW |