Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1516)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java

Issue 2828793002: Refactoring ChildProcessConnection. (Closed)
Patch Set: More test fixing. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java b/content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java
index beb3074d2bdaba8fca7b49cc82abad772bc16ceb..81ee555687550b421a1142f78998567db0ac082d 100644
--- a/content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java
@@ -22,6 +22,8 @@ import org.chromium.base.metrics.RecordHistogram;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.concurrent.GuardedBy;
+
/**
* Manages oom bindings used to bound child services.
*/
@@ -47,7 +49,10 @@ class BindingManagerImpl implements BindingManager {
private static class ModerateBindingPool
extends LruCache<Integer, ManagedConnection> implements ComponentCallbacks2 {
private final Object mDelayedClearerLock = new Object();
+
+ @GuardedBy("mDelayedClearerLock")
private Runnable mDelayedClearer;
+
private final Handler mHandler = new Handler(ThreadUtils.getUiThreadLooper());
public ModerateBindingPool(int maxSize) {
@@ -102,8 +107,8 @@ class BindingManagerImpl implements BindingManager {
}
void addConnection(ManagedConnection managedConnection) {
- ChildProcessConnection connection = managedConnection.mConnection;
- if (connection != null && connection.isInSandbox()) {
+ ManagedChildProcessConnection connection = managedConnection.mConnection;
+ if (connection != null && connection.isSandboxed()) {
managedConnection.addModerateBinding();
if (connection.isModerateBindingBound()) {
put(connection.getServiceNumber(), managedConnection);
@@ -114,8 +119,8 @@ class BindingManagerImpl implements BindingManager {
}
void removeConnection(ManagedConnection managedConnection) {
- ChildProcessConnection connection = managedConnection.mConnection;
- if (connection != null && connection.isInSandbox()) {
+ ManagedChildProcessConnection connection = managedConnection.mConnection;
+ if (connection != null && connection.isSandboxed()) {
remove(connection.getServiceNumber());
}
}
@@ -163,15 +168,15 @@ class BindingManagerImpl implements BindingManager {
new AtomicReference<>();
/**
- * Wraps ChildProcessConnection keeping track of additional information needed to manage the
- * bindings of the connection. The reference to ChildProcessConnection is cleared when the
- * connection goes away, but ManagedConnection itself is kept (until overwritten by a new entry
- * for the same pid).
+ * Wraps ManagedChildProcessConnection keeping track of additional information needed to manage
+ * the bindings of the connection. The reference to ManagedChildProcessConnection is cleared
+ * when the connection goes away, but ManagedConnection itself is kept (until overwritten by a
+ * new entry for the same pid).
*/
private class ManagedConnection {
// Set in constructor, cleared in clearConnection() (on a separate thread).
// Need to keep a local reference to avoid it being cleared while using it.
- private ChildProcessConnection mConnection;
+ private ManagedChildProcessConnection mConnection;
// True iff there is a strong binding kept on the service because it is working in
// foreground.
@@ -181,15 +186,12 @@ class BindingManagerImpl implements BindingManager {
// application background period.
private boolean mBoundForBackgroundPeriod;
- // When mConnection is cleared, oom binding status is stashed here.
- private boolean mWasOomProtected;
-
/**
* Removes the initial service binding.
* @return true if the binding was removed.
*/
private boolean removeInitialBinding() {
- ChildProcessConnection connection = mConnection;
+ ManagedChildProcessConnection connection = mConnection;
if (connection == null || !connection.isInitialBindingBound()) return false;
connection.removeInitialBinding();
@@ -198,7 +200,7 @@ class BindingManagerImpl implements BindingManager {
/** Adds a strong service binding. */
private void addStrongBinding() {
- ChildProcessConnection connection = mConnection;
+ ManagedChildProcessConnection connection = mConnection;
if (connection == null) return;
connection.addStrongBinding();
@@ -208,7 +210,7 @@ class BindingManagerImpl implements BindingManager {
/** Removes a strong service binding. */
private void removeStrongBinding(final boolean keepAsModerate) {
- final ChildProcessConnection connection = mConnection;
+ final ManagedChildProcessConnection connection = mConnection;
// We have to fail gracefully if the strong binding is not present, as on low-end the
// binding could have been removed by dropOomBindings() when a new service was started.
if (connection == null || !connection.isStrongBindingBound()) return;
@@ -239,7 +241,7 @@ class BindingManagerImpl implements BindingManager {
* binding.
* @param connection The ChildProcessConnection to add to the moderate binding pool.
*/
- private void addConnectionToModerateBindingPool(ChildProcessConnection connection) {
+ private void addConnectionToModerateBindingPool(ManagedChildProcessConnection connection) {
ModerateBindingPool moderateBindingPool = mModerateBindingPool.get();
if (moderateBindingPool != null && !connection.isStrongBindingBound()) {
moderateBindingPool.addConnection(ManagedConnection.this);
@@ -248,15 +250,14 @@ class BindingManagerImpl implements BindingManager {
/** Removes the moderate service binding. */
private void removeModerateBinding() {
- ChildProcessConnection connection = mConnection;
+ ManagedChildProcessConnection connection = mConnection;
if (connection == null || !connection.isModerateBindingBound()) return;
-
connection.removeModerateBinding();
}
/** Adds the moderate service binding. */
private void addModerateBinding() {
- ChildProcessConnection connection = mConnection;
+ ManagedChildProcessConnection connection = mConnection;
if (connection == null) return;
connection.addModerateBinding();
@@ -268,13 +269,13 @@ class BindingManagerImpl implements BindingManager {
*/
private void dropBindings() {
assert mIsLowMemoryDevice;
- ChildProcessConnection connection = mConnection;
+ ManagedChildProcessConnection connection = mConnection;
if (connection == null) return;
connection.dropOomBindings();
}
- ManagedConnection(ChildProcessConnection connection) {
+ ManagedConnection(ManagedChildProcessConnection connection) {
mConnection = connection;
}
@@ -315,27 +316,11 @@ class BindingManagerImpl implements BindingManager {
mBoundForBackgroundPeriod = nextBound;
}
- boolean isOomProtected() {
- // When a process crashes, we can be queried about its oom status before or after the
- // connection is cleared. For the latter case, the oom status is stashed in
- // mWasOomProtected.
- ChildProcessConnection connection = mConnection;
- return connection != null
- ? connection.isOomProtectedOrWasWhenDied() : mWasOomProtected;
- }
-
void clearConnection() {
- mWasOomProtected = mConnection.isOomProtectedOrWasWhenDied();
ModerateBindingPool moderateBindingPool = mModerateBindingPool.get();
if (moderateBindingPool != null) moderateBindingPool.removeConnection(this);
mConnection = null;
}
-
- /** @return true iff the reference to the connection is no longer held */
- @VisibleForTesting
- boolean isConnectionCleared() {
- return mConnection == null;
- }
}
// This can be manipulated on different threads, synchronize access on mManagedConnections.
@@ -381,7 +366,7 @@ class BindingManagerImpl implements BindingManager {
}
@Override
- public void addNewConnection(int pid, ChildProcessConnection connection) {
+ public void addNewConnection(int pid, ManagedChildProcessConnection connection) {
// This will reset the previous entry for the pid in the unlikely event of the OS
// reusing renderer pids.
synchronized (mManagedConnections) {
@@ -454,31 +439,24 @@ class BindingManagerImpl implements BindingManager {
}
@Override
- public boolean isOomProtected(int pid) {
- // In the unlikely event of the OS reusing renderer pid, the call will refer to the most
- // recent renderer of the given pid. The binding state for a pid is being reset in
- // addNewConnection().
+ public void removeConnection(int pid) {
ManagedConnection managedConnection;
synchronized (mManagedConnections) {
managedConnection = mManagedConnections.get(pid);
+ if (managedConnection != null) {
+ mManagedConnections.remove(pid);
+ }
}
- return managedConnection != null ? managedConnection.isOomProtected() : false;
- }
-
- @Override
- public void clearConnection(int pid) {
- ManagedConnection managedConnection;
- synchronized (mManagedConnections) {
- managedConnection = mManagedConnections.get(pid);
+ if (managedConnection != null) {
+ managedConnection.clearConnection();
}
- if (managedConnection != null) managedConnection.clearConnection();
}
/** @return true iff the connection reference is no longer held */
@VisibleForTesting
public boolean isConnectionCleared(int pid) {
synchronized (mManagedConnections) {
- return mManagedConnections.get(pid).isConnectionCleared();
+ return mManagedConnections.get(pid) == null;
}
}

Powered by Google App Engine
This is Rietveld 408576698