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
This commit is contained in:
Wei Wang
2017-05-01 20:24:19 -07:00
committed by Zheng Zhang
parent 33676dddbd
commit 2ed0166808

View File

@@ -388,6 +388,8 @@ public class GnssLocationProvider implements LocationProviderInterface {
// Wakelocks // Wakelocks
private final static String WAKELOCK_KEY = "GnssLocationProvider"; private final static String WAKELOCK_KEY = "GnssLocationProvider";
private final PowerManager.WakeLock mWakeLock; private final PowerManager.WakeLock mWakeLock;
private static final String DOWNLOAD_EXTRA_WAKELOCK_KEY = "GnssLocationProviderXtraDownload";
private final PowerManager.WakeLock mDownloadXtraWakeLock;
// Alarms // Alarms
private final static String ALARM_WAKEUP = "com.android.internal.location.ALARM_WAKEUP"; 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 = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
mWakeLock.setReferenceCounted(true); 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); mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
mWakeupIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_WAKEUP), 0); mWakeupIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_WAKEUP), 0);
mTimeoutIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_TIMEOUT), 0); mTimeoutIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_TIMEOUT), 0);
@@ -1026,7 +1033,7 @@ public class GnssLocationProvider implements LocationProviderInterface {
mDownloadXtraDataPending = STATE_DOWNLOADING; mDownloadXtraDataPending = STATE_DOWNLOADING;
// hold wake lock while task runs // 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()"); Log.i(TAG, "WakeLock acquired by handleDownloadXtraData()");
AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() { AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
@Override @Override
@@ -1048,13 +1055,17 @@ public class GnssLocationProvider implements LocationProviderInterface {
mXtraBackOff.nextBackoffMillis()); mXtraBackOff.nextBackoffMillis());
} }
// release wake lock held by task // Release wake lock held by task, synchronize on mLock in case multiple
if (mWakeLock.isHeld()) { // download tasks overrun.
mWakeLock.release(); synchronized (mLock) {
} else { if (mDownloadXtraWakeLock.isHeld()) {
Log.e(TAG, "WakeLock expired before release in handleDownloadXtraData()"); 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()");
} }
}); });
} }