From d4b630d2a4ce3ef746537c9aa04fdbee5d33d399 Mon Sep 17 00:00:00 2001 From: Mark Fasheh Date: Tue, 4 Apr 2023 18:45:17 +0000 Subject: [PATCH] Don't fire frozen state callbacks under AMS global lock This has too much deadlock potential so let's fire all the callbacks from our handler thread - we already fire the frozen state message from there. Test: Tested on a pixel 6 Bug: 276485767 Change-Id: Icc173b40b7fbc2a4cbbcff4375d58a0fca10bd50 --- .../android/server/am/CachedAppOptimizer.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index f42087ff8006e..8ad76cb668bf6 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -1326,8 +1326,7 @@ public final class CachedAppOptimizer { UidRecord uidRec = app.getUidRecord(); if (uidRec != null && uidRec.isFrozen()) { uidRec.setFrozen(false); - mFreezeHandler.removeMessages(UID_FROZEN_STATE_CHANGED_MSG, app); - reportOneUidFrozenStateChanged(app.uid, false); + postUidFrozenMessage(uidRec.getUid(), false); } opt.setFreezerOverride(false); @@ -1468,8 +1467,7 @@ public final class CachedAppOptimizer { UidRecord uidRec = app.getUidRecord(); if (uidRec != null && uidRec.isFrozen()) { uidRec.setFrozen(false); - mFreezeHandler.removeMessages(UID_FROZEN_STATE_CHANGED_MSG, app); - reportOneUidFrozenStateChanged(app.uid, false); + postUidFrozenMessage(uidRec.getUid(), false); } mFrozenProcesses.delete(app.getPid()); @@ -1998,6 +1996,15 @@ public final class CachedAppOptimizer { mAm.reportUidFrozenStateChanged(uids, frozenStates); } + private void postUidFrozenMessage(int uid, boolean frozen) { + final Integer uidObj = Integer.valueOf(uid); + mFreezeHandler.removeEqualMessages(UID_FROZEN_STATE_CHANGED_MSG, uidObj); + + final int op = frozen ? 1 : 0; + mFreezeHandler.sendMessage(mFreezeHandler.obtainMessage(UID_FROZEN_STATE_CHANGED_MSG, op, + 0, uidObj)); + } + private final class FreezeHandler extends Handler implements ProcLocksReader.ProcLocksReaderCallback { private FreezeHandler() { @@ -2028,7 +2035,9 @@ public final class CachedAppOptimizer { reportUnfreeze(pid, frozenDuration, processName, reason); break; case UID_FROZEN_STATE_CHANGED_MSG: - reportOneUidFrozenStateChanged(((ProcessRecord) msg.obj).uid, true); + final boolean frozen = (msg.arg1 == 1); + final int uid = (int) msg.obj; + reportOneUidFrozenStateChanged(uid, frozen); break; case DEADLOCK_WATCHDOG_MSG: try { @@ -2139,8 +2148,8 @@ public final class CachedAppOptimizer { final UidRecord uidRec = proc.getUidRecord(); if (frozen && uidRec != null && uidRec.areAllProcessesFrozen()) { uidRec.setFrozen(true); - mFreezeHandler.sendMessage(mFreezeHandler.obtainMessage( - UID_FROZEN_STATE_CHANGED_MSG, proc)); + + postUidFrozenMessage(uidRec.getUid(), true); } }