CachedAppOptimizer: update pending freeze inside the process lock

Only update pending freeze once mProcLock has been acquired. If this
doesn't happen, the following is possible:

1. FreezeHandler calls setPendingFreeze(false)
2. FreezeHandler blocks on mProcLock, held by someone
3. BroadcastQueue calls notifyStartedRunning
4. BroadcastQueue calls unfreezeTemporarily, which grabs mProcLock
5. BQ wins mProcLock race and sees opt.isPendingFreeze == false
and opt.isFrozen == false so skips unfreeze
6. FreezeHandler wakes up, grabs mProcLock, and freezes the process

Test: boots
Bug: 267949291
Change-Id: I52ab99f3b838e86d187a5a2a27652f78896ffaa4
This commit is contained in:
Tim Murray
2023-04-27 11:31:56 -07:00
parent ee1c8091c8
commit 83f4c75f80

View File

@@ -2100,9 +2100,12 @@ public final class CachedAppOptimizer {
final boolean frozen;
final ProcessCachedOptimizerRecord opt = proc.mOptRecord;
opt.setPendingFreeze(false);
synchronized (mProcLock) {
// someone has canceled this freeze
if (!opt.isPendingFreeze()) {
return;
}
opt.setPendingFreeze(false);
pid = proc.getPid();
if (mFreezerOverride) {
@@ -2148,7 +2151,6 @@ public final class CachedAppOptimizer {
try {
traceAppFreeze(proc.processName, pid, -1);
Process.setProcessFrozen(pid, proc.uid, true);
opt.setFreezeUnfreezeTime(SystemClock.uptimeMillis());
opt.setFrozen(true);
opt.setHasCollectedFrozenPSS(false);