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