summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-10-08 03:50:07 -0400
committerAndroid (Google) Code Review <android-gerrit@google.com>2009-10-08 03:50:07 -0400
commit8bd04b2000f418c8c6f4f628abc215bb5a688244 (patch)
tree0ba436bd3ab69e4efa6cb83f6debbc4883500d62 /core
parentb134b2038ecabcbec3f9b657834d45de27707068 (diff)
parentea48361d47a2d566922ef26a41ea12d719347618 (diff)
downloadframeworks_base-8bd04b2000f418c8c6f4f628abc215bb5a688244.zip
frameworks_base-8bd04b2000f418c8c6f4f628abc215bb5a688244.tar.gz
frameworks_base-8bd04b2000f418c8c6f4f628abc215bb5a688244.tar.bz2
Merge change Iea48361d into eclair
* changes: fix an NPE on a race condition that occurs when unbinding from an authenticator at the samer time that its process dies: bug 2171204
Diffstat (limited to 'core')
-rw-r--r--core/java/android/accounts/AuthenticatorBindHelper.java24
1 files changed, 15 insertions, 9 deletions
diff --git a/core/java/android/accounts/AuthenticatorBindHelper.java b/core/java/android/accounts/AuthenticatorBindHelper.java
index 91e23ab..2ca1f0e 100644
--- a/core/java/android/accounts/AuthenticatorBindHelper.java
+++ b/core/java/android/accounts/AuthenticatorBindHelper.java
@@ -146,7 +146,7 @@ public class AuthenticatorBindHelper {
Log.v(TAG, "there are no more callbacks for service "
+ authenticatorType + ", unbinding service");
}
- unbindFromService(authenticatorType);
+ unbindFromServiceLocked(authenticatorType);
} else {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "leaving service " + authenticatorType
@@ -161,7 +161,10 @@ public class AuthenticatorBindHelper {
}
}
- private void unbindFromService(String authenticatorType) {
+ /**
+ * You must synchronized on mServiceConnections before calling this
+ */
+ private void unbindFromServiceLocked(String authenticatorType) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "unbindService from " + authenticatorType);
}
@@ -217,15 +220,18 @@ public class AuthenticatorBindHelper {
// post a message for each service user to tell them that the service is disconnected,
// and unbind from the service.
synchronized (mServiceConnections) {
- for (Callback callback : mServiceUsers.get(mAuthenticatorType)) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "the service became disconnected, scheduling a "
- + "disconnected message for "
- + mAuthenticatorType);
+ final ArrayList<Callback> callbackList = mServiceUsers.get(mAuthenticatorType);
+ if (callbackList != null) {
+ for (Callback callback : callbackList) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "the service became disconnected, scheduling a "
+ + "disconnected message for "
+ + mAuthenticatorType);
+ }
+ mHandler.obtainMessage(mMessageWhatDisconnected, callback).sendToTarget();
}
- mHandler.obtainMessage(mMessageWhatDisconnected, callback).sendToTarget();
+ unbindFromServiceLocked(mAuthenticatorType);
}
- unbindFromService(mAuthenticatorType);
}
}
}