Skip to content

Commit 028872f

Browse files
author
Jeff Brown
committed
Fix GpsLocationProvider wake lock book keeping.
The GpsLocationProvider typically acquires a wake lock before sending a message to its handler then releases it after the message has been handled. There were two cases where messages might be removed from the handler, resulting in the wake lock being released. There were also two cases where background tasks were being started while not holding a wake lock for the duration. Fixed these issues and marked the GpsLocationProvider handler as asynchronous too so that it doesn't accidentally get blocked by traversals if it happens to share a thread with some UI. Bug: 7057752 Change-Id: I8e12fc91ae943e84db068c08ec809879537503c6
1 parent a2910d0 commit 028872f

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

services/java/com/android/server/location/GpsLocationProvider.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,8 @@ private void handleInjectNtpTime() {
598598
}
599599
mInjectNtpTimePending = STATE_DOWNLOADING;
600600

601+
// hold wake lock while task runs
602+
mWakeLock.acquire();
601603
AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
602604
@Override
603605
public void run() {
@@ -628,14 +630,16 @@ public void run() {
628630
delay = RETRY_INTERVAL;
629631
}
630632

631-
mHandler.sendMessage(Message.obtain(mHandler, INJECT_NTP_TIME_FINISHED));
633+
sendMessage(INJECT_NTP_TIME_FINISHED, 0, null);
632634

633635
if (mPeriodicTimeInjection) {
634636
// send delayed message for next NTP injection
635637
// since this is delayed and not urgent we do not hold a wake lock here
636-
mHandler.removeMessages(INJECT_NTP_TIME);
637-
mHandler.sendMessageDelayed(Message.obtain(mHandler, INJECT_NTP_TIME), delay);
638+
mHandler.sendEmptyMessageDelayed(INJECT_NTP_TIME, delay);
638639
}
640+
641+
// release wake lock held by task
642+
mWakeLock.release();
639643
}
640644
});
641645
}
@@ -652,6 +656,8 @@ private void handleDownloadXtraData() {
652656
}
653657
mDownloadXtraDataPending = STATE_DOWNLOADING;
654658

659+
// hold wake lock while task runs
660+
mWakeLock.acquire();
655661
AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
656662
@Override
657663
public void run() {
@@ -664,17 +670,17 @@ public void run() {
664670
native_inject_xtra_data(data, data.length);
665671
}
666672

667-
mHandler.sendMessage(Message.obtain(mHandler, DOWNLOAD_XTRA_DATA_FINISHED));
673+
sendMessage(DOWNLOAD_XTRA_DATA_FINISHED, 0, null);
668674

669675
if (data == null) {
670676
// try again later
671677
// since this is delayed and not urgent we do not hold a wake lock here
672-
mHandler.removeMessages(DOWNLOAD_XTRA_DATA);
673-
mHandler.sendMessageDelayed(Message.obtain(mHandler, DOWNLOAD_XTRA_DATA),
674-
RETRY_INTERVAL);
678+
mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA, RETRY_INTERVAL);
675679
}
676-
}
677680

681+
// release wake lock held by task
682+
mWakeLock.release();
683+
}
678684
});
679685
}
680686

@@ -1475,11 +1481,17 @@ private void requestRefLocation(int flags) {
14751481

14761482
private void sendMessage(int message, int arg, Object obj) {
14771483
// hold a wake lock until this message is delivered
1484+
// note that this assumes the message will not be removed from the queue before
1485+
// it is handled (otherwise the wake lock would be leaked).
14781486
mWakeLock.acquire();
14791487
mHandler.obtainMessage(message, arg, 1, obj).sendToTarget();
14801488
}
14811489

14821490
private final class ProviderHandler extends Handler {
1491+
public ProviderHandler() {
1492+
super(true /*async*/);
1493+
}
1494+
14831495
@Override
14841496
public void handleMessage(Message msg) {
14851497
int message = msg.what;

0 commit comments

Comments
 (0)