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

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: based on CL 1813963002 Created 4 years, 9 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::MemoryPressureListenerObservers*
19 MemoryPressureListener::g_observers =
20 new MemoryPressureListener::MemoryPressureListenerObservers();
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 g_observers->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 g_observers->observers_.Get().AddObserver(this);
35 base::AutoLock lock(g_observers->sync_observers_lock_.Get());
36 g_observers->sync_observers_.Get().AddObserver(this);
37
45 } 38 }
46 39
47 MemoryPressureListener::~MemoryPressureListener() { 40 MemoryPressureListener::~MemoryPressureListener() {
48 g_observers.Get().RemoveObserver(this); 41 g_observers->observers_.Get().RemoveObserver(this);
42 base::AutoLock lock(g_observers->sync_observers_lock_.Get());
43 g_observers->sync_observers_.Get().RemoveObserver(this);
44
49 } 45 }
50 46
51 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { 47 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
52 callback_.Run(memory_pressure_level); 48 callback_.Run(memory_pressure_level);
53 } 49 }
54 50
51 void MemoryPressureListener::SyncNotify(
52 MemoryPressureLevel memory_pressure_level) {
53 if (!sync_memory_pressure_callback_.is_null()) {
54 sync_memory_pressure_callback_.Run(memory_pressure_level);
55 }
56 }
57
55 // static 58 // static
56 void MemoryPressureListener::NotifyMemoryPressure( 59 void MemoryPressureListener::NotifyMemoryPressure(
57 MemoryPressureLevel memory_pressure_level) { 60 MemoryPressureLevel memory_pressure_level) {
58 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 61 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
59 TRACE_EVENT1("memory", "MemoryPressureListener::NotifyMemoryPressure", 62 TRACE_EVENT1("memory", "MemoryPressureListener::NotifyMemoryPressure",
60 "level", memory_pressure_level); 63 "level", memory_pressure_level);
61 if (AreNotificationsSuppressed()) 64 if (AreNotificationsSuppressed())
62 return; 65 return;
63 DoNotifyMemoryPressure(memory_pressure_level); 66 DoNotifyMemoryPressure(memory_pressure_level);
64 } 67 }
(...skipping 12 matching lines...) Expand all
77 void MemoryPressureListener::SimulatePressureNotification( 80 void MemoryPressureListener::SimulatePressureNotification(
78 MemoryPressureLevel memory_pressure_level) { 81 MemoryPressureLevel memory_pressure_level) {
79 // Notify all listeners even if regular pressure notifications are suppressed. 82 // Notify all listeners even if regular pressure notifications are suppressed.
80 DoNotifyMemoryPressure(memory_pressure_level); 83 DoNotifyMemoryPressure(memory_pressure_level);
81 } 84 }
82 85
83 // static 86 // static
84 void MemoryPressureListener::DoNotifyMemoryPressure( 87 void MemoryPressureListener::DoNotifyMemoryPressure(
85 MemoryPressureLevel memory_pressure_level) { 88 MemoryPressureLevel memory_pressure_level) {
86 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE); 89 DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
87 g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify, 90
88 memory_pressure_level); 91 g_observers->observers_.Get().Notify(FROM_HERE,
92 &MemoryPressureListener::Notify, memory_pressure_level);
93 base::AutoLock lock(g_observers->sync_observers_lock_.Get());
94 FOR_EACH_OBSERVER(
95 MemoryPressureListener, g_observers->sync_observers_.Get(),
96 SyncNotify(memory_pressure_level));
89 } 97 }
90 98
91 } // namespace base 99 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698