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; |
} |
} |