Home | History | Annotate | Download | only in memory
      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