diff options
author | Victoria Lease <violets@google.com> | 2013-05-29 15:28:26 -0700 |
---|---|---|
committer | Victoria Lease <violets@google.com> | 2013-05-29 17:11:25 -0700 |
commit | a9770e4f062226821c9f66b86128f208b91e2d50 (patch) | |
tree | d79e02d3614751d60db21627dc41e0e354938e76 /services/java/com/android/server/LocationManagerService.java | |
parent | 673903a2759067b29bed7e309211000d365e0ad3 (diff) |
break up LocationManagerService's WakeLock
This commit splits LocationManagerService's monolithic WakeLock into
per-LocationManagerService.Receiver WakeLocks, for better WorkSource
accounting. This should make it easier to debug location-related
power issues.
Change-Id: I0d2897c305a38099f9663dc1bc9354ce4bbe1077
(cherry picked from commit 0aa28602d51bf41e46d18ffefe724ebc3ff7a704)
Diffstat (limited to 'services/java/com/android/server/LocationManagerService.java')
-rw-r--r-- | services/java/com/android/server/LocationManagerService.java | 78 |
1 files changed, 23 insertions, 55 deletions
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index 142357d4e875..c4ed4655147e 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -135,8 +135,8 @@ public class LocationManagerService extends ILocationManager.Stub { // --- fields below are final after systemReady() --- private LocationFudger mLocationFudger; private GeofenceManager mGeofenceManager; - private PowerManager.WakeLock mWakeLock; private PackageManager mPackageManager; + private PowerManager mPowerManager; private GeocoderProxy mGeocodeProvider; private IGpsStatusProvider mGpsStatusProvider; private INetInitiatedListener mNetInitiatedListener; @@ -145,9 +145,6 @@ public class LocationManagerService extends ILocationManager.Stub { private LocationBlacklist mBlacklist; private HandlerThread mHandlerThread; - // --- fields below are protected by mWakeLock --- - private int mPendingBroadcasts; - // --- fields below are protected by mLock --- // Set of providers that are explicitly enabled private final Set<String> mEnabledProviders = new HashSet<String>(); @@ -210,10 +207,8 @@ public class LocationManagerService extends ILocationManager.Stub { // fetch package manager mPackageManager = mContext.getPackageManager(); - // prepare wake lock - PowerManager powerManager = - (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY); + // fetch power manager + mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); // prepare worker thread mHandlerThread = new HandlerThread(THREAD_NAME, Process.THREAD_PRIORITY_BACKGROUND); @@ -469,6 +464,7 @@ public class LocationManagerService extends ILocationManager.Stub { final HashMap<String,UpdateRecord> mUpdateRecords = new HashMap<String,UpdateRecord>(); int mPendingBroadcasts; + PowerManager.WakeLock mWakeLock; Receiver(ILocationListener listener, PendingIntent intent, int pid, int uid, String packageName) { @@ -483,6 +479,10 @@ public class LocationManagerService extends ILocationManager.Stub { mUid = uid; mPid = pid; mPackageName = packageName; + + // construct/configure wakelock + mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY); + mWakeLock.setWorkSource(new WorkSource(mUid, mPackageName)); } @Override @@ -645,10 +645,7 @@ public class LocationManagerService extends ILocationManager.Stub { removeUpdatesLocked(this); } synchronized (this) { - if (mPendingBroadcasts > 0) { - LocationManagerService.this.decrementPendingBroadcasts(); - mPendingBroadcasts = 0; - } + clearPendingBroadcastsLocked(); } } @@ -664,13 +661,24 @@ public class LocationManagerService extends ILocationManager.Stub { // containing the sending of the broadcaset private void incrementPendingBroadcastsLocked() { if (mPendingBroadcasts++ == 0) { - LocationManagerService.this.incrementPendingBroadcasts(); + mWakeLock.acquire(); } } private void decrementPendingBroadcastsLocked() { if (--mPendingBroadcasts == 0) { - LocationManagerService.this.decrementPendingBroadcasts(); + if (mWakeLock.isHeld()) { + mWakeLock.release(); + } + } + } + + public void clearPendingBroadcastsLocked() { + if (mPendingBroadcasts > 0) { + mPendingBroadcasts = 0; + if (mWakeLock.isHeld()) { + mWakeLock.release(); + } } } } @@ -1352,10 +1360,7 @@ public class LocationManagerService extends ILocationManager.Stub { if (mReceivers.remove(receiver.mKey) != null && receiver.isListener()) { receiver.getListener().asBinder().unlinkToDeath(receiver, 0); synchronized (receiver) { - if (receiver.mPendingBroadcasts > 0) { - decrementPendingBroadcasts(); - receiver.mPendingBroadcasts = 0; - } + receiver.clearPendingBroadcastsLocked(); } } @@ -1957,43 +1962,6 @@ public class LocationManagerService extends ILocationManager.Stub { } }; - // Wake locks - - private void incrementPendingBroadcasts() { - synchronized (mWakeLock) { - if (mPendingBroadcasts++ == 0) { - try { - mWakeLock.acquire(); - log("Acquired wakelock"); - } catch (Exception e) { - // This is to catch a runtime exception thrown when we try to release an - // already released lock. - Slog.e(TAG, "exception in acquireWakeLock()", e); - } - } - } - } - - private void decrementPendingBroadcasts() { - synchronized (mWakeLock) { - if (--mPendingBroadcasts == 0) { - try { - // Release wake lock - if (mWakeLock.isHeld()) { - mWakeLock.release(); - log("Released wakelock"); - } else { - log("Can't release wakelock again!"); - } - } catch (Exception e) { - // This is to catch a runtime exception thrown when we try to release an - // already released lock. - Slog.e(TAG, "exception in releaseWakeLock()", e); - } - } - } - } - // Geocoder @Override |