diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 913f151496467..f4685f0f6125f 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -1921,9 +1921,26 @@ 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((ProcessRecord) msg.obj); + 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, OomAdjuster.OOM_ADJ_REASON_NONE); + } + } + } + } break; case REPORT_UNFREEZE_MSG: int pid = msg.arg1; @@ -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, @@ -2123,22 +2130,25 @@ public final class CachedAppOptimizer { if (DEBUG_FREEZER) { Slog.d(TAG_AM, "Blocking file lock found: " + pids); } - synchronized (mProcLock) { - int pid = pids.get(0); - ProcessRecord app = mFrozenProcesses.get(pid); - ProcessRecord pr; - if (app != null) { - for (int i = 1; i < pids.size(); i++) { - int blocked = pids.get(i); - synchronized (mAm.mPidsSelfLocked) { - pr = mAm.mPidsSelfLocked.get(blocked); - } - if (pr != null && pr.mState.getCurAdj() < ProcessList.CACHED_APP_MIN_ADJ) { - Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks " - + pr.processName + " (" + blocked + ")"); - // Found at least one blocked non-cached process - unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE); - break; + synchronized (mAm) { + synchronized (mProcLock) { + int pid = pids.get(0); + ProcessRecord app = mFrozenProcesses.get(pid); + ProcessRecord pr; + if (app != null) { + for (int i = 1; i < pids.size(); i++) { + int blocked = pids.get(i); + synchronized (mAm.mPidsSelfLocked) { + pr = mAm.mPidsSelfLocked.get(blocked); + } + if (pr != null + && pr.mState.getCurAdj() < ProcessList.CACHED_APP_MIN_ADJ) { + Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks " + + pr.processName + " (" + blocked + ")"); + // Found at least one blocked non-cached process + unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE); + break; + } } } }