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

Commit 16afc22c authored by Jing Ji's avatar Jing Ji
Browse files

Skip scheduling cached app compaction if there's already a pending one

Bug: 163297662
Test: atest CachedAppOptimizerTest
Test: Manual - Boot & check the logs
Change-Id: Ib8e8b1d68b0e9572ffa1362029316814757e9180
parent 1325fdd0
Loading
Loading
Loading
Loading
+27 −14
Original line number Diff line number Diff line
@@ -382,11 +382,14 @@ public final class CachedAppOptimizer {
    @GuardedBy("mProcLock")
    void compactAppSome(ProcessRecord app) {
        app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_SOME);
        if (!app.mOptRecord.hasPendingCompact()) {
            app.mOptRecord.setHasPendingCompact(true);
            mPendingCompactionProcesses.add(app);
            mCompactionHandler.sendMessage(
                    mCompactionHandler.obtainMessage(
                    COMPACT_PROCESS_MSG, app.mState.getSetAdj(), app.mState.getSetProcState()));
        }
    }

    @GuardedBy("mProcLock")
    void compactAppFull(ProcessRecord app) {
@@ -396,10 +399,13 @@ public final class CachedAppOptimizer {
                && app.mState.getCurAdj() >= mCompactThrottleMinOomAdj
                && app.mState.getCurAdj() <= mCompactThrottleMaxOomAdj) {
            app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_FULL);
            if (!app.mOptRecord.hasPendingCompact()) {
                app.mOptRecord.setHasPendingCompact(true);
                mPendingCompactionProcesses.add(app);
                mCompactionHandler.sendMessage(
                        mCompactionHandler.obtainMessage(
                        COMPACT_PROCESS_MSG, app.mState.getSetAdj(), app.mState.getSetProcState()));
            }
        } else {
            if (DEBUG_COMPACTION) {
                Slog.d(TAG_AM, "Skipping full compaction for " + app.processName
@@ -412,11 +418,14 @@ public final class CachedAppOptimizer {
    @GuardedBy("mProcLock")
    void compactAppPersistent(ProcessRecord app) {
        app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_PERSISTENT);
        if (!app.mOptRecord.hasPendingCompact()) {
            app.mOptRecord.setHasPendingCompact(true);
            mPendingCompactionProcesses.add(app);
            mCompactionHandler.sendMessage(
                    mCompactionHandler.obtainMessage(
                    COMPACT_PROCESS_MSG, app.mState.getCurAdj(), app.mState.getSetProcState()));
        }
    }

    @GuardedBy("mProcLock")
    boolean shouldCompactPersistent(ProcessRecord app, long now) {
@@ -427,11 +436,14 @@ public final class CachedAppOptimizer {
    @GuardedBy("mProcLock")
    void compactAppBfgs(ProcessRecord app) {
        app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_BFGS);
        if (!app.mOptRecord.hasPendingCompact()) {
            app.mOptRecord.setHasPendingCompact(true);
            mPendingCompactionProcesses.add(app);
            mCompactionHandler.sendMessage(
                    mCompactionHandler.obtainMessage(
                    COMPACT_PROCESS_MSG, app.mState.getCurAdj(), app.mState.getSetProcState()));
        }
    }

    @GuardedBy("mProcLock")
    boolean shouldCompactBFGS(ProcessRecord app, long now) {
@@ -954,6 +966,7 @@ public final class CachedAppOptimizer {
                        pendingAction = opt.getReqCompactAction();
                        pid = proc.getPid();
                        name = proc.processName;
                        opt.setHasPendingCompact(false);

                        // don't compact if the process has returned to perceptible
                        // and this is only a cached/home/prev compaction
+16 −0
Original line number Diff line number Diff line
@@ -46,6 +46,12 @@ final class ProcessCachedOptimizerRecord {
    @GuardedBy("mProcLock")
    private int mLastCompactAction;

    /**
     * This process has been scheduled for a memory compaction.
     */
    @GuardedBy("mProcLock")
    private boolean mPendingCompact;

    /**
     * True when the process is frozen.
     */
@@ -100,6 +106,16 @@ final class ProcessCachedOptimizerRecord {
        mLastCompactAction = lastCompactAction;
    }

    @GuardedBy("mProcLock")
    boolean hasPendingCompact() {
        return mPendingCompact;
    }

    @GuardedBy("mProcLock")
    void setHasPendingCompact(boolean pendingCompact) {
        mPendingCompact = pendingCompact;
    }

    @GuardedBy("mProcLock")
    boolean isFrozen() {
        return mFrozen;