Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Side by Side Diff: base/memory/memory_pressure_listener.cc

Issue 1953483002: Revert of Do V8 GC ASAP if system memory is pressured (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/memory/memory_pressure_listener.h ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
11 namespace base { 11 namespace base {
12 12
13 namespace { 13 namespace {
14 14
15 class MemoryPressureObserver { 15 // ObserverListThreadSafe is RefCountedThreadSafe, this traits is needed
16 public: 16 // to ensure the LazyInstance will hold a reference to it.
17 MemoryPressureObserver() 17 struct LeakyLazyObserverListTraits :
18 : async_observers_(new ObserverListThreadSafe<MemoryPressureListener>), 18 base::internal::LeakyLazyInstanceTraits<
19 sync_observers_(new ObserverList<MemoryPressureListener>) { 19 ObserverListThreadSafe<MemoryPressureListener> > {
20 static ObserverListThreadSafe<MemoryPressureListener>*
21 New(void* instance) {
22 ObserverListThreadSafe<MemoryPressureListener>* ret =
23 base::internal::LeakyLazyInstanceTraits<
24 ObserverListThreadSafe<MemoryPressureListener>>::New(instance);
25 // Leaky.
26 ret->AddRef();
27 return ret;
20 } 28 }
21
22 void AddObserver(MemoryPressureListener* listener, bool sync) {
23 async_observers_->AddObserver(listener);
24 if (sync) {
25 AutoLock lock(sync_observers_lock_);
26 sync_observers_->AddObserver(listener);
27 }
28 }
29
30 void RemoveObserver(MemoryPressureListener* listener) {
31 async_observers_->RemoveObserver(listener);
32 AutoLock lock(sync_observers_lock_);
33 sync_observers_->RemoveObserver(listener);
34 }
35
36 void Notify(MemoryPressureListener::MemoryPressureLevel
37 memory_pressure_level) {
38 async_observers_->Notify(FROM_HERE,
39 &MemoryPressureListener::Notify, memory_pressure_level);
40 AutoLock lock(sync_observers_lock_);
41 FOR_EACH_OBSERVER(MemoryPressureListener, *sync_observers_,
42 MemoryPressureListener::SyncNotify(memory_pressure_level));
43 }
44
45 private:
46 scoped_refptr<ObserverListThreadSafe<MemoryPressureListener>>
47 async_observers_;
48 ObserverList<MemoryPressureListener>* sync_observers_;
49 Lock sync_observers_lock_;
50
51 DISALLOW_COPY_AND_ASSIGN(MemoryPressureObserver);
52 }; 29 };
53 30
54 LazyInstance<MemoryPressureObserver>::Leaky g_observer = 31 LazyInstance<
55 LAZY_INSTANCE_INITIALIZER; 32 ObserverListThreadSafe<MemoryPressureListener>,
33 LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER;
56 34
35 // All memory pressure notifications within this process will be suppressed if
36 // this variable is set to 1.
57 subtle::Atomic32 g_notifications_suppressed = 0; 37 subtle::Atomic32 g_notifications_suppressed = 0;
58 38
59 } // namespace 39 } // namespace
60 40
61 MemoryPressureListener::MemoryPressureListener( 41 MemoryPressureListener::MemoryPressureListener(
62 const MemoryPressureListener::MemoryPressureCallback& callback) 42 const MemoryPressureListener::MemoryPressureCallback& callback)
63 : callback_(callback) { 43 : callback_(callback) {
64 g_observer.Get().AddObserver(this, false); 44 g_observers.Get().AddObserver(this);
65 }
66
67 MemoryPressureListener::MemoryPressureListener(
68 const MemoryPressureListener::MemoryPressureCallback& callback,
69 const MemoryPressureListener::SyncMemoryPressureCallback&
70 sync_memory_pressure_callback)
71 : callback_(callback),
72 sync_memory_pressure_callback_(sync_memory_pressure_callback) {
73 g_observer.Get().AddObserver(this, true);
74 } 45 }
75 46
76 MemoryPressureListener::~MemoryPressureListener() { 47 MemoryPressureListener::~MemoryPressureListener() {
77 g_observer.Get().RemoveObserver(this); 48 g_observers.Get().RemoveObserver(this);
78 } 49 }
79 50
80 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { 51 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
81 callback_.Run(memory_pressure_level); 52 callback_.Run(memory_pressure_level);
82 } 53 }
83 54
84 void MemoryPressureListener::SyncNotify(
85 MemoryPressureLevel memory_pressure_level) {
86 if (!sync_memory_pressure_callback_.is_null()) {
87 sync_memory_pressure_callback_.Run(memory_pressure_level);
88 }
89 }
90
91 // static 55 // static
92 void MemoryPressureListener::NotifyMemoryPressure( 56 void MemoryPressureListener::NotifyMemoryPressure(
93 MemoryPressureLevel memory_pressure_level) { 57 MemoryPressureLevel memory_pressure_level) {
94 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 58 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
95 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("memory-infra"), 59 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("memory-infra"),
96 "MemoryPressureListener::NotifyMemoryPressure", 60 "MemoryPressureListener::NotifyMemoryPressure",
97 TRACE_EVENT_SCOPE_THREAD, "level", 61 TRACE_EVENT_SCOPE_THREAD, "level",
98 memory_pressure_level); 62 memory_pressure_level);
99 if (AreNotificationsSuppressed()) 63 if (AreNotificationsSuppressed())
100 return; 64 return;
(...skipping 14 matching lines...) Expand all
115 void MemoryPressureListener::SimulatePressureNotification( 79 void MemoryPressureListener::SimulatePressureNotification(
116 MemoryPressureLevel memory_pressure_level) { 80 MemoryPressureLevel memory_pressure_level) {
117 // Notify all listeners even if regular pressure notifications are suppressed. 81 // Notify all listeners even if regular pressure notifications are suppressed.
118 DoNotifyMemoryPressure(memory_pressure_level); 82 DoNotifyMemoryPressure(memory_pressure_level);
119 } 83 }
120 84
121 // static 85 // static
122 void MemoryPressureListener::DoNotifyMemoryPressure( 86 void MemoryPressureListener::DoNotifyMemoryPressure(
123 MemoryPressureLevel memory_pressure_level) { 87 MemoryPressureLevel memory_pressure_level) {
124 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 88 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
125 89 g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify,
126 g_observer.Get().Notify(memory_pressure_level); 90 memory_pressure_level);
127 } 91 }
128 92
129 } // namespace base 93 } // namespace base
OLDNEW
« no previous file with comments | « base/memory/memory_pressure_listener.h ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698