From 2acfd34ccbd39258422333c9c66c586297c97683 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Wed, 22 Sep 2010 12:13:39 -0400 Subject: [PATCH] GpsLocationProvider: Fix race condition while bringing up APN for SUPL. If handleUpdateNetworkState() is called before ConnectivityManager.startUsingNetworkFeature() returns, then we will not call native_agps_data_conn_open() to inform the GPS that the APN is up. So we now set mAGpsDataConnectionState to AGPS_DATA_CONNECTION_OPENING before calling ConnectivityManager.startUsingNetworkFeature() to avoid this problem. Change-Id: I5e1597d6494dc8ab68e608911c546a7a04f2ea07 Signed-off-by: Mike Lockwood --- .../com/android/server/location/GpsLocationProvider.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java index 3bf6ee4062f4a..39ce0b63b1861 100755 --- a/services/java/com/android/server/location/GpsLocationProvider.java +++ b/services/java/com/android/server/location/GpsLocationProvider.java @@ -1171,7 +1171,10 @@ public class GpsLocationProvider implements LocationProviderInterface { private void reportAGpsStatus(int type, int status) { switch (status) { case GPS_REQUEST_AGPS_DATA_CONN: - int result = mConnMgr.startUsingNetworkFeature( + // Set mAGpsDataConnectionState before calling startUsingNetworkFeature + // to avoid a race condition with handleUpdateNetworkState() + mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPENING; + int result = mConnMgr.startUsingNetworkFeature( ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_SUPL); if (result == Phone.APN_ALREADY_ACTIVE) { if (mAGpsApn != null) { @@ -1179,11 +1182,13 @@ public class GpsLocationProvider implements LocationProviderInterface { mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPEN; } else { Log.e(TAG, "mAGpsApn not set when receiving Phone.APN_ALREADY_ACTIVE"); + mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED; native_agps_data_conn_failed(); } } else if (result == Phone.APN_REQUEST_STARTED) { - mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPENING; + // Nothing to do here } else { + mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED; native_agps_data_conn_failed(); } break;