Merge "Merge "Prevent double teardown of service connections" into qt-dev am: ae76af46b2 am: 991bcc3d78" into qt-r1-dev-plus-aosp

This commit is contained in:
Android Build Merger (Role)
2019-05-31 17:52:14 +00:00
committed by Android (Google) Code Review
3 changed files with 20 additions and 7 deletions

View File

@@ -278,7 +278,7 @@ public abstract class ActivityManagerInternal {
String resolvedType, boolean fgRequired, String callingPackage, int userId,
boolean allowBackgroundActivityStarts) throws TransactionTooLargeException;
public abstract void disconnectActivityFromServices(Object connectionHolder);
public abstract void disconnectActivityFromServices(Object connectionHolder, Object conns);
public abstract void cleanUpServices(int userId, ComponentName component, Intent baseIntent);
public abstract ActivityInfo getActivityInfoForUser(ActivityInfo aInfo, int userId);
public abstract void ensureBootCompleted();

View File

@@ -18156,13 +18156,20 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
// The arguments here are untyped because the base ActivityManagerInternal class
// doesn't have compile-time visiblity into ActivityServiceConnectionHolder or
// ConnectionRecord.
@Override
public void disconnectActivityFromServices(Object connectionHolder) {
public void disconnectActivityFromServices(Object connectionHolder, Object conns) {
// 'connectionHolder' is an untyped ActivityServiceConnectionsHolder
// 'conns' is an untyped HashSet<ConnectionRecord>
final ActivityServiceConnectionsHolder holder =
(ActivityServiceConnectionsHolder) connectionHolder;
final HashSet<ConnectionRecord> toDisconnect = (HashSet<ConnectionRecord>) conns;
synchronized(ActivityManagerService.this) {
final ActivityServiceConnectionsHolder c =
(ActivityServiceConnectionsHolder) connectionHolder;
c.forEachConnection(cr -> mServices.removeConnectionLocked(
(ConnectionRecord) cr, null, c));
for (ConnectionRecord cr : toDisconnect) {
mServices.removeConnectionLocked(cr, null, holder);
}
}
}

View File

@@ -101,7 +101,13 @@ public class ActivityServiceConnectionsHolder<T> {
if (mConnections == null || mConnections.isEmpty()) {
return;
}
mService.mH.post(() -> mService.mAmInternal.disconnectActivityFromServices(this));
// Capture and null out mConnections, to guarantee that we process
// disconnect of these specific connections exactly once even if
// we're racing with rapid activity lifecycle churn and this
// method is invoked more than once on this object.
final Object disc = mConnections;
mConnections = null;
mService.mH.post(() -> mService.mAmInternal.disconnectActivityFromServices(this, disc));
}
public void dump(PrintWriter pw, String prefix) {