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

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

Issue 1749073002: Do V8 GC ASAP if system memory is pressured (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase 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
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 // ObserverListThreadSafe is RefCountedThreadSafe, this traits is needed 15 class MemoryPressureObserver {
16 // to ensure the LazyInstance will hold a reference to it. 16 public:
17 struct LeakyLazyObserverListTraits : 17 MemoryPressureObserver()
18 base::internal::LeakyLazyInstanceTraits< 18 : async_observers_(new ObserverListThreadSafe<MemoryPressureListener>),
19 ObserverListThreadSafe<MemoryPressureListener> > { 19 sync_observers_(new ObserverList<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;
28 } 20 }
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);
29 }; 52 };
30 53
31 LazyInstance< 54 LazyInstance<MemoryPressureObserver>::Leaky g_observer =
32 ObserverListThreadSafe<MemoryPressureListener>, 55 LAZY_INSTANCE_INITIALIZER;
33 LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER;
34 56
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; 57 subtle::Atomic32 g_notifications_suppressed = 0;
38 58
39 } // namespace 59 } // namespace
40 60
41 MemoryPressureListener::MemoryPressureListener( 61 MemoryPressureListener::MemoryPressureListener(
42 const MemoryPressureListener::MemoryPressureCallback& callback) 62 const MemoryPressureListener::MemoryPressureCallback& callback)
43 : callback_(callback) { 63 : callback_(callback) {
44 g_observers.Get().AddObserver(this); 64 g_observer.Get().AddObserver(this, false);
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);
45 } 74 }
46 75
47 MemoryPressureListener::~MemoryPressureListener() { 76 MemoryPressureListener::~MemoryPressureListener() {
48 g_observers.Get().RemoveObserver(this); 77 g_observer.Get().RemoveObserver(this);
49 } 78 }
50 79
51 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { 80 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
52 callback_.Run(memory_pressure_level); 81 callback_.Run(memory_pressure_level);
53 } 82 }
54 83
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
55 // static 91 // static
56 void MemoryPressureListener::NotifyMemoryPressure( 92 void MemoryPressureListener::NotifyMemoryPressure(
57 MemoryPressureLevel memory_pressure_level) { 93 MemoryPressureLevel memory_pressure_level) {
58 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 94 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
59 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("memory-infra"), 95 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("memory-infra"),
60 "MemoryPressureListener::NotifyMemoryPressure", 96 "MemoryPressureListener::NotifyMemoryPressure",
61 TRACE_EVENT_SCOPE_THREAD, "level", 97 TRACE_EVENT_SCOPE_THREAD, "level",
62 memory_pressure_level); 98 memory_pressure_level);
63 if (AreNotificationsSuppressed()) 99 if (AreNotificationsSuppressed())
64 return; 100 return;
(...skipping 14 matching lines...) Expand all
79 void MemoryPressureListener::SimulatePressureNotification( 115 void MemoryPressureListener::SimulatePressureNotification(
80 MemoryPressureLevel memory_pressure_level) { 116 MemoryPressureLevel memory_pressure_level) {
81 // Notify all listeners even if regular pressure notifications are suppressed. 117 // Notify all listeners even if regular pressure notifications are suppressed.
82 DoNotifyMemoryPressure(memory_pressure_level); 118 DoNotifyMemoryPressure(memory_pressure_level);
83 } 119 }
84 120
85 // static 121 // static
86 void MemoryPressureListener::DoNotifyMemoryPressure( 122 void MemoryPressureListener::DoNotifyMemoryPressure(
87 MemoryPressureLevel memory_pressure_level) { 123 MemoryPressureLevel memory_pressure_level) {
88 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 124 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
89 g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify, 125
90 memory_pressure_level); 126 g_observer.Get().Notify(memory_pressure_level);
91 } 127 }
92 128
93 } // namespace base 129 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698