From ba8a54136d184d48fbed4f7b27734f645e4e8ad0 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Tue, 16 Jul 2013 15:18:19 -0700 Subject: [PATCH] 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) --- .../android/server/power/PowerManagerService.java | 26 +++++++++++++--------- 1 file 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(); + } } }; -- 2.11.0