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

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 //static
18 MemoryPressureListener* MemoryPressureListener::g_listener =
19 new MemoryPressureListener();
Mark Mentovai 2016/04/20 13:21:33 This results in a module initializer. Can’t do tha
hong.zheng 2016/04/21 12:18:04 Done.
20
21 MemoryPressureListener::MemoryPressureListener()
22 : observers_(LAZY_INSTANCE_INITIALIZER),
23 sync_observers_(LAZY_INSTANCE_INITIALIZER),
24 sync_observers_lock_(LAZY_INSTANCE_INITIALIZER) {}
25
41 MemoryPressureListener::MemoryPressureListener( 26 MemoryPressureListener::MemoryPressureListener(
42 const MemoryPressureListener::MemoryPressureCallback& callback) 27 const MemoryPressureListener::MemoryPressureCallback& callback)
43 : callback_(callback) { 28 : callback_(callback) {
44 g_observers.Get().AddObserver(this); 29 g_listener->observers_.Get().AddObserver(this);
30 }
31
32 MemoryPressureListener::MemoryPressureListener(
33 const MemoryPressureListener::MemoryPressureCallback& callback,
34 const MemoryPressureListener::SyncMemoryPressureCallback&
35 sync_memory_pressure_callback)
36 : callback_(callback),
37 sync_memory_pressure_callback_(sync_memory_pressure_callback) {
38 g_listener->observers_.Get().AddObserver(this);
39 base::AutoLock lock(g_listener->sync_observers_lock_.Get());
40 g_listener->sync_observers_.Get().AddObserver(this);
45 } 41 }
46 42
47 MemoryPressureListener::~MemoryPressureListener() { 43 MemoryPressureListener::~MemoryPressureListener() {
48 g_observers.Get().RemoveObserver(this); 44 g_listener->observers_.Get().RemoveObserver(this);
45 base::AutoLock lock(g_listener->sync_observers_lock_.Get());
46 g_listener->sync_observers_.Get().RemoveObserver(this);
49 } 47 }
50 48
51 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { 49 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
52 callback_.Run(memory_pressure_level); 50 callback_.Run(memory_pressure_level);
53 } 51 }
54 52
53 void MemoryPressureListener::SyncNotify(
54 MemoryPressureLevel memory_pressure_level) {
55 if (!sync_memory_pressure_callback_.is_null()) {
56 sync_memory_pressure_callback_.Run(memory_pressure_level);
57 }
58 }
59
55 // static 60 // static
56 void MemoryPressureListener::NotifyMemoryPressure( 61 void MemoryPressureListener::NotifyMemoryPressure(
57 MemoryPressureLevel memory_pressure_level) { 62 MemoryPressureLevel memory_pressure_level) {
58 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 63 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
59 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("memory-infra"), 64 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("memory-infra"),
60 "MemoryPressureListener::NotifyMemoryPressure", 65 "MemoryPressureListener::NotifyMemoryPressure",
61 TRACE_EVENT_SCOPE_THREAD, "level", 66 TRACE_EVENT_SCOPE_THREAD, "level",
62 memory_pressure_level); 67 memory_pressure_level);
63 if (AreNotificationsSuppressed()) 68 if (AreNotificationsSuppressed())
64 return; 69 return;
(...skipping 14 matching lines...) Expand all
79 void MemoryPressureListener::SimulatePressureNotification( 84 void MemoryPressureListener::SimulatePressureNotification(
80 MemoryPressureLevel memory_pressure_level) { 85 MemoryPressureLevel memory_pressure_level) {
81 // Notify all listeners even if regular pressure notifications are suppressed. 86 // Notify all listeners even if regular pressure notifications are suppressed.
82 DoNotifyMemoryPressure(memory_pressure_level); 87 DoNotifyMemoryPressure(memory_pressure_level);
83 } 88 }
84 89
85 // static 90 // static
86 void MemoryPressureListener::DoNotifyMemoryPressure( 91 void MemoryPressureListener::DoNotifyMemoryPressure(
87 MemoryPressureLevel memory_pressure_level) { 92 MemoryPressureLevel memory_pressure_level) {
88 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 93 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
89 g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify, 94
90 memory_pressure_level); 95 g_listener->observers_.Get().Notify(FROM_HERE,
96 &MemoryPressureListener::Notify, memory_pressure_level);
97 base::AutoLock lock(g_listener->sync_observers_lock_.Get());
98 FOR_EACH_OBSERVER(
99 MemoryPressureListener, g_listener->sync_observers_.Get(),
100 SyncNotify(memory_pressure_level));
91 } 101 }
92 102
93 } // namespace base 103 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698