From 5a0a1d95ab4a8863fbb790fbf620ed8965db0270 Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Tue, 9 Jun 2020 11:40:09 -0700 Subject: DO NOT MERGE: Do not hold mLock when calling GNSS HAL Test: on device Bug: 156867071 Change-Id: I57c3bfb8148350855af1dc4b662526a4e6043b8e --- .../android/server/location/LocationManagerService.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index 067bdcb111fb..bfcbe465a271 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -231,7 +231,7 @@ public class LocationManagerService extends ILocationManager.Stub { private final AppForegroundHelper mAppForegroundHelper; private final LocationUsageLogger mLocationUsageLogger; - @Nullable private GnssManagerService mGnssManagerService = null; + @Nullable private volatile GnssManagerService mGnssManagerService = null; private final PassiveLocationProviderManager mPassiveManager; @@ -381,6 +381,10 @@ public class LocationManagerService extends ILocationManager.Stub { // prepare providers initializeProvidersLocked(); } + + // initialize gnss last because it has no awareness of boot phases and blindly assumes that + // all other location providers are loaded at initialization + initializeGnss(); } private void onAppOpChanged(String packageName) { @@ -602,16 +606,19 @@ public class LocationManagerService extends ILocationManager.Stub { } manager.setMockProvider(new MockProvider(properties)); } + } - // initialize gnss last because it has no awareness of boot phases and blindly assumes that - // all other location providers are loaded at initialization + private void initializeGnss() { + // Do not hold mLock when calling GnssManagerService#isGnssSupported() which calls into HAL. if (GnssManagerService.isGnssSupported()) { mGnssManagerService = new GnssManagerService(mContext, mAppOpsHelper, mSettingsHelper, mAppForegroundHelper, mLocationUsageLogger); mGnssManagerService.onSystemReady(); LocationProviderManager gnssManager = new LocationProviderManager(GPS_PROVIDER); - mProviderManagers.add(gnssManager); + synchronized (mLock) { + mProviderManagers.add(gnssManager); + } gnssManager.setRealProvider(mGnssManagerService.getGnssLocationProvider()); // bind to geofence proxy -- cgit v1.2.3-59-g8ed1b