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

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: address comments Created 4 years, 8 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"
8 #include "base/observer_list_threadsafe.h"
9 #include "base/trace_event/trace_event.h" 7 #include "base/trace_event/trace_event.h"
10 8
11 namespace base { 9 namespace base {
12 10
13 namespace { 11 namespace {
14 12
15 // ObserverListThreadSafe is RefCountedThreadSafe, this traits is needed
16 // to ensure the LazyInstance will hold a reference to it.
17 struct LeakyLazyObserverListTraits :
18 base::internal::LeakyLazyInstanceTraits<
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;
28 }
29 };
30
31 LazyInstance<
32 ObserverListThreadSafe<MemoryPressureListener>,
33 LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER;
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; 13 subtle::Atomic32 g_notifications_suppressed = 0;
38 14
39 } // namespace 15 } // namespace
40 16
17 MemoryPressureListener::MemoryPressureListener()
18 : observers_(LAZY_INSTANCE_INITIALIZER),
19 sync_observers_(LAZY_INSTANCE_INITIALIZER),
20 sync_observers_lock_(LAZY_INSTANCE_INITIALIZER) {}
21
41 MemoryPressureListener::MemoryPressureListener( 22 MemoryPressureListener::MemoryPressureListener(
42 const MemoryPressureListener::MemoryPressureCallback& callback) 23 const MemoryPressureListener::MemoryPressureCallback& callback)
43 : callback_(callback) { 24 : callback_(callback) {
44 g_observers.Get().AddObserver(this); 25 GlobalListener()->observers_.Get().AddObserver(this);
26 }
27
28 MemoryPressureListener::MemoryPressureListener(
29 const MemoryPressureListener::MemoryPressureCallback& callback,
30 const MemoryPressureListener::SyncMemoryPressureCallback&
31 sync_memory_pressure_callback)
32 : callback_(callback),
33 sync_memory_pressure_callback_(sync_memory_pressure_callback) {
34 GlobalListener()->observers_.Get().AddObserver(this);
35 base::AutoLock lock(GlobalListener()->sync_observers_lock_.Get());
Mark Mentovai 2016/04/21 20:45:33 Same here and on lines 59 and 111.
36 GlobalListener()->sync_observers_.Get().AddObserver(this);
37 }
38
39 //static
40 MemoryPressureListener* MemoryPressureListener::Create(
41 const MemoryPressureCallback& memory_pressure_callback) {
42 if (!GlobalListener())
Mark Mentovai 2016/04/21 20:45:33 Why would there not be any GlobalListener()? You’r
43 return nullptr;
44 return new MemoryPressureListener(memory_pressure_callback);
45 }
46
47 //static
48 MemoryPressureListener* MemoryPressureListener::Create(
49 const MemoryPressureCallback& memory_pressure_callback,
50 const SyncMemoryPressureCallback& sync_memory_pressure_callback) {
51 if (!GlobalListener())
52 return nullptr;
53 return new MemoryPressureListener(memory_pressure_callback,
54 sync_memory_pressure_callback);
45 } 55 }
46 56
47 MemoryPressureListener::~MemoryPressureListener() { 57 MemoryPressureListener::~MemoryPressureListener() {
48 g_observers.Get().RemoveObserver(this); 58 GlobalListener()->observers_.Get().RemoveObserver(this);
59 base::AutoLock lock(GlobalListener()->sync_observers_lock_.Get());
60 GlobalListener()->sync_observers_.Get().RemoveObserver(this);
49 } 61 }
50 62
51 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { 63 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
52 callback_.Run(memory_pressure_level); 64 callback_.Run(memory_pressure_level);
53 } 65 }
54 66
67 void MemoryPressureListener::SyncNotify(
68 MemoryPressureLevel memory_pressure_level) {
69 if (!sync_memory_pressure_callback_.is_null()) {
70 sync_memory_pressure_callback_.Run(memory_pressure_level);
71 }
72 }
73
55 // static 74 // static
56 void MemoryPressureListener::NotifyMemoryPressure( 75 void MemoryPressureListener::NotifyMemoryPressure(
57 MemoryPressureLevel memory_pressure_level) { 76 MemoryPressureLevel memory_pressure_level) {
58 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 77 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
59 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("memory-infra"), 78 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("memory-infra"),
60 "MemoryPressureListener::NotifyMemoryPressure", 79 "MemoryPressureListener::NotifyMemoryPressure",
61 TRACE_EVENT_SCOPE_THREAD, "level", 80 TRACE_EVENT_SCOPE_THREAD, "level",
62 memory_pressure_level); 81 memory_pressure_level);
63 if (AreNotificationsSuppressed()) 82 if (AreNotificationsSuppressed())
64 return; 83 return;
(...skipping 14 matching lines...) Expand all
79 void MemoryPressureListener::SimulatePressureNotification( 98 void MemoryPressureListener::SimulatePressureNotification(
80 MemoryPressureLevel memory_pressure_level) { 99 MemoryPressureLevel memory_pressure_level) {
81 // Notify all listeners even if regular pressure notifications are suppressed. 100 // Notify all listeners even if regular pressure notifications are suppressed.
82 DoNotifyMemoryPressure(memory_pressure_level); 101 DoNotifyMemoryPressure(memory_pressure_level);
83 } 102 }
84 103
85 // static 104 // static
86 void MemoryPressureListener::DoNotifyMemoryPressure( 105 void MemoryPressureListener::DoNotifyMemoryPressure(
87 MemoryPressureLevel memory_pressure_level) { 106 MemoryPressureLevel memory_pressure_level) {
88 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 107 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
89 g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify, 108
90 memory_pressure_level); 109 GlobalListener()->observers_.Get().Notify(FROM_HERE,
110 &MemoryPressureListener::Notify, memory_pressure_level);
111 base::AutoLock lock(GlobalListener()->sync_observers_lock_.Get());
112 FOR_EACH_OBSERVER(
113 MemoryPressureListener, GlobalListener()->sync_observers_.Get(),
114 SyncNotify(memory_pressure_level));
115 }
116
117 //static
118 MemoryPressureListener* MemoryPressureListener::GlobalListener() {
119 static MemoryPressureListener* listener = new MemoryPressureListener();
Mark Mentovai 2016/04/21 20:45:33 This is the thing that should have been the lazy i
hong.zheng 2016/04/22 07:14:57 Done.
120 return listener;
Mark Mentovai 2016/04/21 20:45:33 Which functions get called on the global listener?
hong.zheng 2016/04/22 07:14:57 Done.
91 } 121 }
92 122
93 } // namespace base 123 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698