From 2ed0166808e99aeef15a0fe4bbbd6a78a87faef7 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Mon, 1 May 2017 20:24:19 -0700 Subject: [PATCH] Fix Wakelock underlock in GnssLocationProvider. Added a separate wakelock for xtra download so it won't interfer with any wakelocks. Test: manual Bug: 37545729 Change-Id: I0867166f03802d1ed133437bcd85b0062db69947 --- .../server/location/GnssLocationProvider.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index ee4602074d307..551fb5a994319 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -388,6 +388,8 @@ public class GnssLocationProvider implements LocationProviderInterface { // Wakelocks private final static String WAKELOCK_KEY = "GnssLocationProvider"; private final PowerManager.WakeLock mWakeLock; + private static final String DOWNLOAD_EXTRA_WAKELOCK_KEY = "GnssLocationProviderXtraDownload"; + private final PowerManager.WakeLock mDownloadXtraWakeLock; // Alarms private final static String ALARM_WAKEUP = "com.android.internal.location.ALARM_WAKEUP"; @@ -722,6 +724,11 @@ public class GnssLocationProvider implements LocationProviderInterface { mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY); mWakeLock.setReferenceCounted(true); + // Create a separate wake lock for xtra downloader as it may be released due to timeout. + mDownloadXtraWakeLock = mPowerManager.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK, DOWNLOAD_EXTRA_WAKELOCK_KEY); + mDownloadXtraWakeLock.setReferenceCounted(true); + mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); mWakeupIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_WAKEUP), 0); mTimeoutIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_TIMEOUT), 0); @@ -1026,7 +1033,7 @@ public class GnssLocationProvider implements LocationProviderInterface { mDownloadXtraDataPending = STATE_DOWNLOADING; // hold wake lock while task runs - mWakeLock.acquire(DOWNLOAD_XTRA_DATA_TIMEOUT_MS); + mDownloadXtraWakeLock.acquire(DOWNLOAD_XTRA_DATA_TIMEOUT_MS); Log.i(TAG, "WakeLock acquired by handleDownloadXtraData()"); AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() { @Override @@ -1048,13 +1055,17 @@ public class GnssLocationProvider implements LocationProviderInterface { mXtraBackOff.nextBackoffMillis()); } - // release wake lock held by task - if (mWakeLock.isHeld()) { - mWakeLock.release(); - } else { - Log.e(TAG, "WakeLock expired before release in handleDownloadXtraData()"); + // Release wake lock held by task, synchronize on mLock in case multiple + // download tasks overrun. + synchronized (mLock) { + if (mDownloadXtraWakeLock.isHeld()) { + mDownloadXtraWakeLock.release(); + if (DEBUG) Log.d(TAG, "WakeLock released by handleDownloadXtraData()"); + } else { + Log.e(TAG, "WakeLock expired before release in " + + "handleDownloadXtraData()"); + } } - Log.i(TAG, "WakeLock released by handleDownloadXtraData()"); } }); }