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 // MemoryPressure provides static APIs for handling memory pressure on
      6 // platforms that have such signals, such as Android.
      7 // The app will try to discard buffers that aren't deemed essential (individual
      8 // modules will implement their own policy).
      9 //
     10 // Refer to memory_pressure_level_list.h for information about what sorts of
     11 // signals can be sent under what conditions.
     12 
     13 #ifndef BASE_MEMORY_PRESSURE_LISTENER_H_
     14 #define BASE_MEMORY_PRESSURE_LISTENER_H_
     15 
     16 #include "base/base_export.h"
     17 #include "base/basictypes.h"
     18 #include "base/callback.h"
     19 
     20 namespace base {
     21 
     22 // To start listening, create a new instance, passing a callback to a
     23 // function that takes a MemoryPressureLevel parameter. To stop listening,
     24 // simply delete the listener object. The implementation guarantees
     25 // that the callback will always be called on the thread that created
     26 // the listener.
     27 // If this is the same thread as the system is broadcasting the memory pressure
     28 // event on, then it is guaranteed you're called synchronously within that
     29 // broadcast and hence you should not do long-running garbage collection work.
     30 // But conversely, if there's something that needs to be released before
     31 // control is returned to system code, this is the place to do it.
     32 // Please see notes on memory_pressure_level_list.h: some levels are absolutely
     33 // critical, and if not enough memory is returned to the system, it'll
     34 // potentially kill the app, and then later the app will have to be
     35 // cold-started.
     36 //
     37 //
     38 // Example:
     39 //
     40 //    void OnMemoryPressure(MemoryPressureLevel memory_pressure_level) {
     41 //       ...
     42 //    }
     43 //
     44 //    // Start listening.
     45 //    MemoryPressureListener* my_listener =
     46 //        new MemoryPressureListener(base::Bind(&OnMemoryPressure));
     47 //
     48 //    ...
     49 //
     50 //    // Stop listening.
     51 //    delete my_listener;
     52 //
     53 class BASE_EXPORT MemoryPressureListener {
     54  public:
     55   enum MemoryPressureLevel {
     56 #define DEFINE_MEMORY_PRESSURE_LEVEL(name, value) name = value,
     57 #include "base/memory/memory_pressure_level_list.h"
     58 #undef DEFINE_MEMORY_PRESSURE_LEVEL
     59   };
     60 
     61   typedef base::Callback<void(MemoryPressureLevel)> MemoryPressureCallback;
     62 
     63   explicit MemoryPressureListener(
     64       const MemoryPressureCallback& memory_pressure_callback);
     65   ~MemoryPressureListener();
     66 
     67   // Intended for use by the platform specific implementation.
     68   static void NotifyMemoryPressure(MemoryPressureLevel memory_pressure_level);
     69 
     70  private:
     71   void Notify(MemoryPressureLevel memory_pressure_level);
     72 
     73   MemoryPressureCallback callback_;
     74 
     75   DISALLOW_COPY_AND_ASSIGN(MemoryPressureListener);
     76 };
     77 
     78 }  // namespace base
     79 
     80 #endif  // BASE_MEMORY_PRESSURE_LISTENER_H_
     81