Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4b630d2 authored by Mark Fasheh's avatar Mark Fasheh
Browse files

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
parent 86e2b60c
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -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);
                }
            }