am 8bd04b20: Merge change Iea48361d into eclair

Merge commit '8bd04b2000f418c8c6f4f628abc215bb5a688244' into eclair-mr2

* commit '8bd04b2000f418c8c6f4f628abc215bb5a688244':
  fix an NPE on a race condition that occurs when unbinding from an authenticator at the samer time that its process dies: bug 2171204
This commit is contained in:
Fred Quintana
2009-10-08 00:54:41 -07:00
committed by Android Git Automerger

View File

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