17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// MemoryPressure provides static APIs for handling memory pressure on
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// platforms that have such signals, such as Android.
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The app will try to discard buffers that aren't deemed essential (individual
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// modules will implement their own policy).
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Refer to memory_pressure_level_list.h for information about what sorts of
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// signals can be sent under what conditions.
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef BASE_MEMORY_PRESSURE_LISTENER_H_
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define BASE_MEMORY_PRESSURE_LISTENER_H_
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/base_export.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/basictypes.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/callback.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace base {
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// To start listening, create a new instance, passing a callback to a
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// function that takes a MemoryPressureLevel parameter. To stop listening,
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// simply delete the listener object. The implementation guarantees
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// that the callback will always be called on the thread that created
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// the listener.
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Note that even on the same thread, the callback is not guaranteed to be
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// called synchronously within the system memory pressure broadcast.
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Please see notes on memory_pressure_level_list.h: some levels are absolutely
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// critical, and if not enough memory is returned to the system, it'll
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// potentially kill the app, and then later the app will have to be
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// cold-started.
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Example:
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//    void OnMemoryPressure(MemoryPressureLevel memory_pressure_level) {
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//       ...
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//    }
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//    // Start listening.
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//    MemoryPressureListener* my_listener =
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//        new MemoryPressureListener(base::Bind(&OnMemoryPressure));
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//    ...
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//    // Stop listening.
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//    delete my_listener;
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class BASE_EXPORT MemoryPressureListener {
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  enum MemoryPressureLevel {
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define DEFINE_MEMORY_PRESSURE_LEVEL(name, value) name = value,
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/memory_pressure_level_list.h"
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#undef DEFINE_MEMORY_PRESSURE_LEVEL
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  typedef base::Callback<void(MemoryPressureLevel)> MemoryPressureCallback;
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  explicit MemoryPressureListener(
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const MemoryPressureCallback& memory_pressure_callback);
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ~MemoryPressureListener();
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Intended for use by the platform specific implementation.
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void NotifyMemoryPressure(MemoryPressureLevel memory_pressure_level);
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void Notify(MemoryPressureLevel memory_pressure_level);
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MemoryPressureCallback callback_;
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MemoryPressureListener);
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace base
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // BASE_MEMORY_PRESSURE_LISTENER_H_
78