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 |