summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2013-07-16 15:18:19 -0700
committerThe Android Automerger <android-build@google.com>2013-07-17 14:59:19 -0700
commite6771c41e8ae905a616f3fd369d0eacfcd2003b9 (patch)
tree7cc0e3b91a4e3695ca51374cb6d2a53a97966e8e
parent5892fc5d8aaf546e605196c3dc48d8f9e193dc2a (diff)
downloadbase-e6771c41e8ae905a616f3fd369d0eacfcd2003b9.tar.gz
Fix missing lock in power manager.
The display wake lock and other internal state could become out of sync if we happened to execute the power manager's update function concurrently due to the missing lock. This bug can be trigged due to display state changes or proximity sensor updated. Although it would be extremely rare, we have some evidence of this happening on at least a few devices resulting in rapid power drain with the screen off or a crash. Bug: 9880044 Change-Id: I3c674ce429621a50cbb36c3a01883d5f388205b2 (cherry picked from commit d91e417b06388694db213257b4df6b4dd78e0d49)
-rw-r--r--services/java/com/android/server/power/PowerManagerService.java26
1 files changed, 16 insertions, 10 deletions
diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java
index 1203e027fb91..6f70712db20b 100644
--- a/services/java/com/android/server/power/PowerManagerService.java
+++ b/services/java/com/android/server/power/PowerManagerService.java
@@ -1702,24 +1702,30 @@ public final class PowerManagerService extends IPowerManager.Stub
new DisplayPowerController.Callbacks() {
@Override
public void onStateChanged() {
- mDirty |= DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED;
- updatePowerStateLocked();
+ synchronized (mLock) {
+ mDirty |= DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED;
+ updatePowerStateLocked();
+ }
}
@Override
public void onProximityPositive() {
- mProximityPositive = true;
- mDirty |= DIRTY_PROXIMITY_POSITIVE;
- updatePowerStateLocked();
+ synchronized (mLock) {
+ mProximityPositive = true;
+ mDirty |= DIRTY_PROXIMITY_POSITIVE;
+ updatePowerStateLocked();
+ }
}
@Override
public void onProximityNegative() {
- mProximityPositive = false;
- mDirty |= DIRTY_PROXIMITY_POSITIVE;
- userActivityNoUpdateLocked(SystemClock.uptimeMillis(),
- PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
- updatePowerStateLocked();
+ synchronized (mLock) {
+ mProximityPositive = false;
+ mDirty |= DIRTY_PROXIMITY_POSITIVE;
+ userActivityNoUpdateLocked(SystemClock.uptimeMillis(),
+ PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
+ updatePowerStateLocked();
+ }
}
};