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 3 // found in the LICENSE file. 4 5 #include "base/memory/memory_pressure_listener.h" 6 7 #include "base/lazy_instance.h" 8 #include "base/observer_list_threadsafe.h" 9 10 namespace { 11 12 // ObserverListThreadSafe is RefCountedThreadSafe, this traits is needed 13 // to ensure the LazyInstance will hold a reference to it. 14 struct LeakyLazyObserverListTraits : 15 base::internal::LeakyLazyInstanceTraits< 16 ObserverListThreadSafe<base::MemoryPressureListener> > { 17 static ObserverListThreadSafe<base::MemoryPressureListener>* 18 New(void* instance) { 19 ObserverListThreadSafe<base::MemoryPressureListener>* ret = 20 base::internal::LeakyLazyInstanceTraits< 21 ObserverListThreadSafe<base::MemoryPressureListener> >::New( 22 instance); 23 // Leaky. 24 ret->AddRef(); 25 return ret; 26 } 27 }; 28 29 base::LazyInstance< 30 ObserverListThreadSafe<base::MemoryPressureListener>, 31 LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER; 32 } // namespace 33 34 namespace base { 35 36 MemoryPressureListener::MemoryPressureListener( 37 const MemoryPressureListener::MemoryPressureCallback& callback) 38 : callback_(callback) { 39 g_observers.Get().AddObserver(this); 40 } 41 42 MemoryPressureListener::~MemoryPressureListener() { 43 g_observers.Get().RemoveObserver(this); 44 } 45 46 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) { 47 callback_.Run(memory_pressure_level); 48 } 49 50 // static 51 void MemoryPressureListener::NotifyMemoryPressure( 52 MemoryPressureLevel memory_pressure_level) { 53 g_observers.Get().Notify(&MemoryPressureListener::Notify, 54 memory_pressure_level); 55 } 56 57 } // namespace base 58