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

Commit cb335d2b authored by Tim Murray's avatar Tim Murray
Browse files

Freezer: release AM lock while checking /proc/locks

Checking /proc/locks can take a long time if new file locks are being
added. Hoist that outside of the AM lock to make sure that
system_server doesn't stall unnecessarily.

Test: device functions with short freezer timeout
Bug: 269207437
Change-Id: I5bab77281992d0e826427e458025103500fc0869
parent f07755e6
Loading
Loading
Loading
Loading
+37 −27
Original line number Original line Diff line number Diff line
@@ -1921,8 +1921,25 @@ public final class CachedAppOptimizer {
        public void handleMessage(Message msg) {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            switch (msg.what) {
                case SET_FROZEN_PROCESS_MSG:
                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 (mAm) {
                        freezeProcess((ProcessRecord) msg.obj);
                            synchronized (mProcLock) {
                                unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
                            }
                        }
                    }
                }
                }
                    break;
                    break;
                case REPORT_UNFREEZE_MSG:
                case REPORT_UNFREEZE_MSG:
@@ -2057,16 +2074,6 @@ public final class CachedAppOptimizer {
                    }
                    }
                });
                });
            }
            }

            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 (mProcLock) {
                    unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
                }
            }
        }
        }


        private void reportUnfreeze(int pid, int frozenDuration, String processName,
        private void reportUnfreeze(int pid, int frozenDuration, String processName,
@@ -2123,6 +2130,7 @@ public final class CachedAppOptimizer {
            if (DEBUG_FREEZER) {
            if (DEBUG_FREEZER) {
                Slog.d(TAG_AM, "Blocking file lock found: " + pids);
                Slog.d(TAG_AM, "Blocking file lock found: " + pids);
            }
            }
            synchronized (mAm) {
                synchronized (mProcLock) {
                synchronized (mProcLock) {
                    int pid = pids.get(0);
                    int pid = pids.get(0);
                    ProcessRecord app = mFrozenProcesses.get(pid);
                    ProcessRecord app = mFrozenProcesses.get(pid);
@@ -2133,7 +2141,8 @@ public final class CachedAppOptimizer {
                            synchronized (mAm.mPidsSelfLocked) {
                            synchronized (mAm.mPidsSelfLocked) {
                                pr = mAm.mPidsSelfLocked.get(blocked);
                                pr = mAm.mPidsSelfLocked.get(blocked);
                            }
                            }
                        if (pr != null && pr.mState.getCurAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
                            if (pr != null
                                    && pr.mState.getCurAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
                                Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks "
                                Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks "
                                        + pr.processName + " (" + blocked + ")");
                                        + pr.processName + " (" + blocked + ")");
                                // Found at least one blocked non-cached process
                                // Found at least one blocked non-cached process
@@ -2145,6 +2154,7 @@ public final class CachedAppOptimizer {
                }
                }
            }
            }
        }
        }
    }


    /**
    /**
     * Default implementation for ProcessDependencies, public vor visibility to OomAdjuster class.
     * Default implementation for ProcessDependencies, public vor visibility to OomAdjuster class.