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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: base/memory/memory_pressure_listener.cc
diff --git a/base/memory/memory_pressure_listener.cc b/base/memory/memory_pressure_listener.cc
index de63958b929edf86bd61f54be7d5e387129157f3..652fbd784c7243ef6c7bd0fc06110c09d609d149 100644
--- a/base/memory/memory_pressure_listener.cc
+++ b/base/memory/memory_pressure_listener.cc
@@ -4,54 +4,59 @@
#include "base/memory/memory_pressure_listener.h"
-#include "base/lazy_instance.h"
-#include "base/observer_list_threadsafe.h"
#include "base/trace_event/trace_event.h"
namespace base {
namespace {
-// ObserverListThreadSafe is RefCountedThreadSafe, this traits is needed
-// to ensure the LazyInstance will hold a reference to it.
-struct LeakyLazyObserverListTraits :
- base::internal::LeakyLazyInstanceTraits<
- ObserverListThreadSafe<MemoryPressureListener> > {
- static ObserverListThreadSafe<MemoryPressureListener>*
- New(void* instance) {
- ObserverListThreadSafe<MemoryPressureListener>* ret =
- base::internal::LeakyLazyInstanceTraits<
- ObserverListThreadSafe<MemoryPressureListener>>::New(instance);
- // Leaky.
- ret->AddRef();
- return ret;
- }
-};
-
-LazyInstance<
- ObserverListThreadSafe<MemoryPressureListener>,
- LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER;
-
-// All memory pressure notifications within this process will be suppressed if
-// this variable is set to 1.
subtle::Atomic32 g_notifications_suppressed = 0;
} // namespace
+//static
+MemoryPressureListener* MemoryPressureListener::g_listener =
+ 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.
+
+MemoryPressureListener::MemoryPressureListener()
+ : observers_(LAZY_INSTANCE_INITIALIZER),
+ sync_observers_(LAZY_INSTANCE_INITIALIZER),
+ sync_observers_lock_(LAZY_INSTANCE_INITIALIZER) {}
+
MemoryPressureListener::MemoryPressureListener(
const MemoryPressureListener::MemoryPressureCallback& callback)
: callback_(callback) {
- g_observers.Get().AddObserver(this);
+ g_listener->observers_.Get().AddObserver(this);
+}
+
+MemoryPressureListener::MemoryPressureListener(
+ const MemoryPressureListener::MemoryPressureCallback& callback,
+ const MemoryPressureListener::SyncMemoryPressureCallback&
+ sync_memory_pressure_callback)
+ : callback_(callback),
+ sync_memory_pressure_callback_(sync_memory_pressure_callback) {
+ g_listener->observers_.Get().AddObserver(this);
+ base::AutoLock lock(g_listener->sync_observers_lock_.Get());
+ g_listener->sync_observers_.Get().AddObserver(this);
}
MemoryPressureListener::~MemoryPressureListener() {
- g_observers.Get().RemoveObserver(this);
+ g_listener->observers_.Get().RemoveObserver(this);
+ base::AutoLock lock(g_listener->sync_observers_lock_.Get());
+ g_listener->sync_observers_.Get().RemoveObserver(this);
}
void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
callback_.Run(memory_pressure_level);
}
+void MemoryPressureListener::SyncNotify(
+ MemoryPressureLevel memory_pressure_level) {
+ if (!sync_memory_pressure_callback_.is_null()) {
+ sync_memory_pressure_callback_.Run(memory_pressure_level);
+ }
+}
+
// static
void MemoryPressureListener::NotifyMemoryPressure(
MemoryPressureLevel memory_pressure_level) {
@@ -86,8 +91,13 @@ void MemoryPressureListener::SimulatePressureNotification(
void MemoryPressureListener::DoNotifyMemoryPressure(
MemoryPressureLevel memory_pressure_level) {
DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
- g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify,
- memory_pressure_level);
+
+ g_listener->observers_.Get().Notify(FROM_HERE,
+ &MemoryPressureListener::Notify, memory_pressure_level);
+ base::AutoLock lock(g_listener->sync_observers_lock_.Get());
+ FOR_EACH_OBSERVER(
+ MemoryPressureListener, g_listener->sync_observers_.Get(),
+ SyncNotify(memory_pressure_level));
}
} // namespace base

Powered by Google App Engine
This is Rietveld 408576698