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

Commit 7727c3bb authored by Li Li's avatar Li Li Committed by Automerger Merge Worker
Browse files

Merge "Fix potential freezer thrashing" into sc-dev am: 0859a5f4 am: 54182923 am: 71e0c42b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14664159

Change-Id: I161423ec918a6ea44156d0a35e775350ae757083
parents 9def4d00 71e0c42b
Loading
Loading
Loading
Loading
+23 −10
Original line number Original line Diff line number Diff line
@@ -881,7 +881,8 @@ public final class CachedAppOptimizer {


    @GuardedBy({"mAm", "mProcLock"})
    @GuardedBy({"mAm", "mProcLock"})
    void freezeAppAsyncLSP(ProcessRecord app) {
    void freezeAppAsyncLSP(ProcessRecord app) {
        if (mFreezeHandler.hasMessages(SET_FROZEN_PROCESS_MSG, app)) {
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        if (opt.isPendingFreeze()) {
            // Skip redundant DO_FREEZE message
            // Skip redundant DO_FREEZE message
            return;
            return;
        }
        }
@@ -890,21 +891,27 @@ public final class CachedAppOptimizer {
                mFreezeHandler.obtainMessage(
                mFreezeHandler.obtainMessage(
                    SET_FROZEN_PROCESS_MSG, DO_FREEZE, 0, app),
                    SET_FROZEN_PROCESS_MSG, DO_FREEZE, 0, app),
                mFreezerDebounceTimeout);
                mFreezerDebounceTimeout);
        opt.setPendingFreeze(true);
        if (DEBUG_FREEZER) {
            Slog.d(TAG_AM, "Async freezing " + app.getPid() + " " + app.processName);
        }
    }
    }


    @GuardedBy({"mAm", "mProcLock"})
    @GuardedBy({"mAm", "mProcLock"})
    void unfreezeAppLSP(ProcessRecord app) {
    void unfreezeAppLSP(ProcessRecord app) {
        mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);

        final int pid = app.getPid();
        final int pid = app.getPid();
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        opt.setFreezerOverride(false);
        if (opt.isPendingFreeze()) {
        if (!opt.isFrozen()) {
            // Remove pending DO_FREEZE message
            mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);
            opt.setPendingFreeze(false);
            if (DEBUG_FREEZER) {
            if (DEBUG_FREEZER) {
                Slog.d(TAG_AM,
                Slog.d(TAG_AM, "Cancel freezing " + pid + " " + app.processName);
                        "Skipping unfreeze for process " + pid + " "
                        + app.processName + " (not frozen)");
            }
            }
        }

        opt.setFreezerOverride(false);
        if (!opt.isFrozen()) {
            return;
            return;
        }
        }


@@ -983,7 +990,12 @@ public final class CachedAppOptimizer {
    @GuardedBy({"mAm", "mProcLock"})
    @GuardedBy({"mAm", "mProcLock"})
    void unscheduleFreezeAppLSP(ProcessRecord app) {
    void unscheduleFreezeAppLSP(ProcessRecord app) {
        if (mUseFreezer) {
        if (mUseFreezer) {
            final ProcessCachedOptimizerRecord opt = app.mOptRecord;
            if (opt.isPendingFreeze()) {
                // Remove pending DO_FREEZE message
                mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);
                mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);
                opt.setPendingFreeze(false);
            }
        }
        }
    }
    }


@@ -1278,6 +1290,8 @@ public final class CachedAppOptimizer {
            final boolean frozen;
            final boolean frozen;
            final ProcessCachedOptimizerRecord opt = proc.mOptRecord;
            final ProcessCachedOptimizerRecord opt = proc.mOptRecord;


            opt.setPendingFreeze(false);

            try {
            try {
                // pre-check for locks to avoid unnecessary freeze/unfreeze operations
                // pre-check for locks to avoid unnecessary freeze/unfreeze operations
                if (Process.hasFileLocks(pid)) {
                if (Process.hasFileLocks(pid)) {
@@ -1352,7 +1366,6 @@ public final class CachedAppOptimizer {
                return;
                return;
            }
            }



            if (DEBUG_FREEZER) {
            if (DEBUG_FREEZER) {
                Slog.d(TAG_AM, "froze " + pid + " " + name);
                Slog.d(TAG_AM, "froze " + pid + " " + name);
            }
            }
+2 −1
Original line number Original line Diff line number Diff line
@@ -3112,6 +3112,7 @@ public class OomAdjuster {
        // if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze
        // if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze
        if (opt.isFrozen() && opt.shouldNotFreeze()) {
        if (opt.isFrozen() && opt.shouldNotFreeze()) {
            mCachedAppOptimizer.unfreezeAppLSP(app);
            mCachedAppOptimizer.unfreezeAppLSP(app);
            return;
        }
        }


        final ProcessStateRecord state = app.mState;
        final ProcessStateRecord state = app.mState;
@@ -3119,7 +3120,7 @@ public class OomAdjuster {
        if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
        if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ && !opt.isFrozen()
                && !opt.shouldNotFreeze()) {
                && !opt.shouldNotFreeze()) {
            mCachedAppOptimizer.freezeAppAsyncLSP(app);
            mCachedAppOptimizer.freezeAppAsyncLSP(app);
        } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ && opt.isFrozen()) {
        } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
            mCachedAppOptimizer.unfreezeAppLSP(app);
            mCachedAppOptimizer.unfreezeAppLSP(app);
        }
        }
    }
    }
+17 −0
Original line number Original line Diff line number Diff line
@@ -86,6 +86,12 @@ final class ProcessCachedOptimizerRecord {
    @GuardedBy("mProcLock")
    @GuardedBy("mProcLock")
    private boolean mFreezeExempt;
    private boolean mFreezeExempt;


    /**
     * This process has been scheduled for freezing
     */
    @GuardedBy("mProcLock")
    private boolean mPendingFreeze;

    @GuardedBy("mProcLock")
    @GuardedBy("mProcLock")
    long getLastCompactTime() {
    long getLastCompactTime() {
        return mLastCompactTime;
        return mLastCompactTime;
@@ -171,6 +177,16 @@ final class ProcessCachedOptimizerRecord {
        return mFreezeExempt;
        return mFreezeExempt;
    }
    }


    @GuardedBy("mProcLock")
    void setPendingFreeze(boolean freeze) {
        mPendingFreeze = freeze;
    }

    @GuardedBy("mProcLock")
    boolean isPendingFreeze() {
        return mPendingFreeze;
    }

    @GuardedBy("mProcLock")
    @GuardedBy("mProcLock")
    void setFreezeExempt(boolean exempt) {
    void setFreezeExempt(boolean exempt) {
        mFreezeExempt = exempt;
        mFreezeExempt = exempt;
@@ -190,6 +206,7 @@ final class ProcessCachedOptimizerRecord {
        pw.print(prefix); pw.print("lastCompactTime="); pw.print(mLastCompactTime);
        pw.print(prefix); pw.print("lastCompactTime="); pw.print(mLastCompactTime);
        pw.print(" lastCompactAction="); pw.println(mLastCompactAction);
        pw.print(" lastCompactAction="); pw.println(mLastCompactAction);
        pw.print(prefix); pw.print("isFreezeExempt="); pw.print(mFreezeExempt);
        pw.print(prefix); pw.print("isFreezeExempt="); pw.print(mFreezeExempt);
        pw.print(" isPendingFreeze="); pw.print(mPendingFreeze);
        pw.print(" " + IS_FROZEN + "="); pw.println(mFrozen);
        pw.print(" " + IS_FROZEN + "="); pw.println(mFrozen);
    }
    }
}
}