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" | 7 #include "base/lazy_instance.h" |
8 #include "base/observer_list_threadsafe.h" | 8 #include "base/observer_list_threadsafe.h" |
9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
10 | 10 |
(...skipping 14 matching lines...) Expand all Loading... |
25 // Leaky. | 25 // Leaky. |
26 ret->AddRef(); | 26 ret->AddRef(); |
27 return ret; | 27 return ret; |
28 } | 28 } |
29 }; | 29 }; |
30 | 30 |
31 LazyInstance< | 31 LazyInstance< |
32 ObserverListThreadSafe<MemoryPressureListener>, | 32 ObserverListThreadSafe<MemoryPressureListener>, |
33 LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER; | 33 LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER; |
34 | 34 |
| 35 // All memory pressure notifications within this process will be suppressed if |
| 36 // this variable is set to 1. |
| 37 subtle::Atomic32 g_notifications_suppressed = 0; |
| 38 |
35 } // namespace | 39 } // namespace |
36 | 40 |
37 MemoryPressureListener::MemoryPressureListener( | 41 MemoryPressureListener::MemoryPressureListener( |
38 const MemoryPressureListener::MemoryPressureCallback& callback) | 42 const MemoryPressureListener::MemoryPressureCallback& callback) |
39 : callback_(callback) { | 43 : callback_(callback) { |
40 g_observers.Get().AddObserver(this); | 44 g_observers.Get().AddObserver(this); |
41 } | 45 } |
42 | 46 |
43 MemoryPressureListener::~MemoryPressureListener() { | 47 MemoryPressureListener::~MemoryPressureListener() { |
44 g_observers.Get().RemoveObserver(this); | 48 g_observers.Get().RemoveObserver(this); |
45 } | 49 } |
46 | 50 |
47 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { | 51 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { |
48 callback_.Run(memory_pressure_level); | 52 callback_.Run(memory_pressure_level); |
49 } | 53 } |
50 | 54 |
51 // static | 55 // static |
52 void MemoryPressureListener::NotifyMemoryPressure( | 56 void MemoryPressureListener::NotifyMemoryPressure( |
53 MemoryPressureLevel memory_pressure_level) { | 57 MemoryPressureLevel memory_pressure_level) { |
54 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); | 58 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); |
55 TRACE_EVENT1("memory", "MemoryPressureListener::NotifyMemoryPressure", | 59 TRACE_EVENT1("memory", "MemoryPressureListener::NotifyMemoryPressure", |
56 "level", memory_pressure_level); | 60 "level", memory_pressure_level); |
| 61 if (AreNotificationsSuppressed()) |
| 62 return; |
57 g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify, | 63 g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify, |
58 memory_pressure_level); | 64 memory_pressure_level); |
59 } | 65 } |
60 | 66 |
| 67 // static |
| 68 bool MemoryPressureListener::AreNotificationsSuppressed() { |
| 69 return subtle::Acquire_Load(&g_notifications_suppressed) == 1; |
| 70 } |
| 71 |
| 72 // static |
| 73 void MemoryPressureListener::SetNotificationsSuppressed(bool suppress) { |
| 74 subtle::Release_Store(&g_notifications_suppressed, suppress ? 1 : 0); |
| 75 } |
| 76 |
61 } // namespace base | 77 } // namespace base |
OLD | NEW |