From 8c1a8684991ccb0c452e5b4aa0eacf5b8b4e7c5c Mon Sep 17 00:00:00 2001 From: tysonwei Date: Mon, 31 Oct 2022 18:30:57 +0800 Subject: [PATCH] Fix potential race condition problem If we call forceSuspend to enter STR and then resume from it, we should make sure that mForceSuspendActive is set to false to wake up device correctly. Bug: 205257123 Test: 1. forceSuspend 2. wait until kernel enter suspend mode 3. press power button to wakeUp Change-Id: I3c57ff7c7352fe078f2139d9679dc3d860482f05 --- .../server/power/PowerManagerService.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 8c52717b1a206..71e647371ed88 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -4211,8 +4211,8 @@ public final class PowerManagerService extends SystemService } private boolean forceSuspendInternal(int uid) { - try { - synchronized (mLock) { + synchronized (mLock) { + try { mForceSuspendActive = true; // Place the system in an non-interactive state for (int idx = 0; idx < mPowerGroups.size(); idx++) { @@ -4222,16 +4222,14 @@ public final class PowerManagerService extends SystemService // Disable all the partial wake locks as well updateWakeLockDisabledStatesLocked(); - } - Slog.i(TAG, "Force-Suspending (uid " + uid + ")..."); - boolean success = mNativeWrapper.nativeForceSuspend(); - if (!success) { - Slog.i(TAG, "Force-Suspending failed in native."); - } - return success; - } finally { - synchronized (mLock) { + Slog.i(TAG, "Force-Suspending (uid " + uid + ")..."); + boolean success = mNativeWrapper.nativeForceSuspend(); + if (!success) { + Slog.i(TAG, "Force-Suspending failed in native."); + } + return success; + } finally { mForceSuspendActive = false; // Re-enable wake locks once again. updateWakeLockDisabledStatesLocked();