From a9b43182c6b43204a79e22e7efeadbd190520dd2 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Thu, 21 Jul 2016 13:20:38 -0700 Subject: [PATCH] ServiceConnection: Properly serialize events Fixes a bug where onServiceDisconnected could be delayed such that it would be dispatched after the connection has already reconnected. Bug: 30182617 Change-Id: I6e3fc2f125a477bb342de601530c254c34ffb4f7 --- core/java/android/app/LoadedApk.java | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index b889c8f9a81b..7754244cae8e 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -1396,18 +1396,6 @@ public final class LoadedApk { } public void death(ComponentName name, IBinder service) { - ServiceDispatcher.ConnectionInfo old; - - synchronized (this) { - old = mActiveConnections.remove(name); - if (old == null || old.binder != service) { - // Death for someone different than who we last - // reported... just ignore it. - return; - } - old.binder.unlinkToDeath(old.deathMonitor, 0); - } - if (mActivityThread != null) { mActivityThread.post(new RunConnection(name, service, 1)); } else { @@ -1456,7 +1444,7 @@ public final class LoadedApk { } } - // If there was an old service, it is not disconnected. + // If there was an old service, it is now disconnected. if (old != null) { mConnection.onServiceDisconnected(name); } @@ -1467,6 +1455,17 @@ public final class LoadedApk { } public void doDeath(ComponentName name, IBinder service) { + synchronized (this) { + ConnectionInfo old = mActiveConnections.get(name); + if (old == null || old.binder != service) { + // Death for someone different than who we last + // reported... just ignore it. + return; + } + mActiveConnections.remove(name); + old.binder.unlinkToDeath(old.deathMonitor, 0); + } + mConnection.onServiceDisconnected(name); } -- 2.11.0