blob: c080895d9ba158d4585e187b6ad7dcc75cbb40de [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.content.browser;
/**
* Manages oom bindings used to bound child services. "Oom binding" is a binding that raises the
* process oom priority so that it shouldn't be killed by the OS out-of-memory killer under
* normal conditions (it can still be killed under drastic memory pressure). ChildProcessConnections
* have two oom bindings: initial binding and strong binding.
*
* BindingManager receives calls that signal status of each service (setInForeground(),
* determinedVisibility()) and the entire embedding application (onSentToBackground(),
* onBroughtToForeground()) and manipulates child process bindings accordingly.
*
* In particular, BindingManager is responsible for:
* - adding and removing the strong binding as service visibility changes (setInForeground())
* - removing the initial binding of a service when we can start to rely on the visibility signal /
* strong binding exclusively (after determinedVisibility())
* - dropping the current oom bindings when a new connection is started on a low-memory device
* - keeping a strong binding on the foreground service while the entire application is in
* background
*
* Thread-safety: most of the methods will be called only on the main thread, exceptions are
* explicitly noted.
*/
public interface BindingManager {
/**
* Registers a freshly started child process. On low-memory devices this will also drop the
* oom bindings of the last process that was oom-bound. We can do that, because every time a
* connection is created on the low-end, it is used in foreground (no prerendering, no
* loading of tabs opened in background). This can be called on any thread.
* @param pid handle of the service process
*/
void addNewConnection(int pid, ChildProcessConnection connection);
/**
* Called when the service visibility changes or is determined for the first time.
* @param pid handle of the service process
* @param inForeground true iff the service is visibile to the user
*/
void setInForeground(int pid, boolean inForeground);
/**
* Called when we can begin to rely on the visibility signal only and remove the initial
* binding. It's safe to call it multiple times, only the first call matters.
* @param pid handle of the service process
*/
void determinedVisibility(int pid);
/**
* Called when the embedding application is sent to background. We want to maintain a strong
* binding on the most recently used renderer while the embedder is in background, to indicate
* the relative importance of the renderer to system oom killer.
*
* The embedder needs to ensure that:
* - every onBroughtToForeground() is followed by onSentToBackground()
* - pairs of consecutive onBroughtToForeground() / onSentToBackground() calls do not overlap
*/
void onSentToBackground();
/**
* Called when the embedding application is brought to foreground. This will drop the strong
* binding kept on the main renderer during the background period, so the embedder should make
* sure that this is called after the regular strong binding is attached for the foreground
* session.
*/
void onBroughtToForeground();
/**
* @return True iff the given service process is protected from the out-of-memory killing, or it
* was protected when it died unexpectedly. This can be used to decide if a disconnection of a
* renderer was a crash or a probable out-of-memory kill. This can be called on any thread.
*/
boolean isOomProtected(int pid);
/**
* Should be called when the connection to the child process goes away (either after a clean
* exit or an unexpected crash). At this point we let go of the reference to the
* ChildProcessConnection. This can be called on any thread.
*/
void clearConnection(int pid);
}