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

Commit 319c4fb9 authored by Li Li's avatar Li Li Committed by Android (Google) Code Review
Browse files

Merge "Optimize Freezer deadlock detection" into udc-dev

parents a27b117a 7bcf8f1d
Loading
Loading
Loading
Loading
+16 −18
Original line number Diff line number Diff line
@@ -178,6 +178,7 @@ public final class CachedAppOptimizer {
    private static final String ATRACE_FREEZER_TRACK = "Freezer";

    private static final int FREEZE_BINDER_TIMEOUT_MS = 100;
    private static final int FREEZE_DEADLOCK_TIMEOUT_MS = 1000;

    @VisibleForTesting static final boolean ENABLE_FILE_COMPACT = false;

@@ -244,6 +245,7 @@ public final class CachedAppOptimizer {
    static final int REPORT_UNFREEZE_MSG = 4;
    static final int COMPACT_NATIVE_MSG = 5;
    static final int UID_FROZEN_STATE_CHANGED_MSG = 6;
    static final int DEADLOCK_WATCHDOG_MSG = 7;

    // When free swap falls below this percentage threshold any full (file + anon)
    // compactions will be downgraded to file only compactions to reduce pressure
@@ -1947,28 +1949,14 @@ public final class CachedAppOptimizer {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SET_FROZEN_PROCESS_MSG:
                {
                    ProcessRecord proc = (ProcessRecord) msg.obj;
                    int pid = proc.getPid();
                    final String name = proc.processName;
                    synchronized (mAm) {
                        freezeProcess(proc);
                    }
                    try {
                        // post-check to prevent deadlock
                        mProcLocksReader.handleBlockingFileLocks(this);
                    } catch (Exception e) {
                        Slog.e(TAG_AM, "Unable to check file locks for "
                                + name + "(" + pid + "): " + e);
                        synchronized (mAm) {
                            synchronized (mProcLock) {
                                unfreezeAppLSP(proc, UNFREEZE_REASON_FILE_LOCK_CHECK_FAILURE);
                            }
                        }
                    }
                    if (proc.mOptRecord.isFrozen()) {
                        onProcessFrozen(proc);
                    }
                        removeMessages(DEADLOCK_WATCHDOG_MSG);
                        sendEmptyMessageDelayed(DEADLOCK_WATCHDOG_MSG, FREEZE_DEADLOCK_TIMEOUT_MS);
                    }
                    break;
                case REPORT_UNFREEZE_MSG:
@@ -1981,8 +1969,18 @@ public final class CachedAppOptimizer {
                    reportUnfreeze(pid, frozenDuration, processName, reason);
                    break;
                case UID_FROZEN_STATE_CHANGED_MSG:
                    ProcessRecord proc = (ProcessRecord) msg.obj;
                    reportOneUidFrozenStateChanged(proc.uid, true);
                    reportOneUidFrozenStateChanged(((ProcessRecord) msg.obj).uid, true);
                    break;
                case DEADLOCK_WATCHDOG_MSG:
                    try {
                        // post-check to prevent deadlock
                        if (DEBUG_FREEZER) {
                            Slog.d(TAG_AM, "Freezer deadlock watchdog");
                        }
                        mProcLocksReader.handleBlockingFileLocks(this);
                    } catch (IOException e) {
                        Slog.w(TAG_AM, "Unable to check file locks");
                    }
                    break;
                default:
                    return;