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 " Log.v(TAG, "there are no more callbacks for service "
+ authenticatorType + ", unbinding service"); + authenticatorType + ", unbinding service");
} }
unbindFromService(authenticatorType); unbindFromServiceLocked(authenticatorType);
} else { } else {
if (Log.isLoggable(TAG, Log.VERBOSE)) { if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "leaving service " + authenticatorType 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)) { if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "unbindService from " + authenticatorType); Log.v(TAG, "unbindService from " + authenticatorType);
} }
@@ -217,7 +220,9 @@ public class AuthenticatorBindHelper {
// post a message for each service user to tell them that the service is disconnected, // post a message for each service user to tell them that the service is disconnected,
// and unbind from the service. // and unbind from the service.
synchronized (mServiceConnections) { synchronized (mServiceConnections) {
for (Callback callback : mServiceUsers.get(mAuthenticatorType)) { final ArrayList<Callback> callbackList = mServiceUsers.get(mAuthenticatorType);
if (callbackList != null) {
for (Callback callback : callbackList) {
if (Log.isLoggable(TAG, Log.VERBOSE)) { if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "the service became disconnected, scheduling a " Log.v(TAG, "the service became disconnected, scheduling a "
+ "disconnected message for " + "disconnected message for "
@@ -225,7 +230,8 @@ public class AuthenticatorBindHelper {
} }
mHandler.obtainMessage(mMessageWhatDisconnected, callback).sendToTarget(); mHandler.obtainMessage(mMessageWhatDisconnected, callback).sendToTarget();
} }
unbindFromService(mAuthenticatorType); unbindFromServiceLocked(mAuthenticatorType);
}
} }
} }
} }