Merge "freezer: synchronous unfreeze" into rvc-dev
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index be48374..3a6065e 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -126,7 +126,7 @@
static final int FREEZE_TIMEOUT_MS = 500;
static final int DO_FREEZE = 1;
- static final int DO_UNFREEZE = 2;
+ static final int REPORT_UNFREEZE = 2;
/**
* This thread must be moved to the system background cpuset.
@@ -613,12 +613,67 @@
FREEZE_TIMEOUT_MS);
}
+ private final class UnfreezeStats {
+ final int mPid;
+ final String mName;
+ final long mFrozenDuration;
+
+ UnfreezeStats(int pid, String name, long frozenDuration) {
+ mPid = pid;
+ mName = name;
+ mFrozenDuration = frozenDuration;
+ }
+
+ public int getPid() {
+ return mPid;
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ public long getFrozenDuration() {
+ return mFrozenDuration;
+ }
+ }
+
@GuardedBy("mAm")
- void unfreezeAppAsync(ProcessRecord app) {
+ void unfreezeAppLocked(ProcessRecord app) {
mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);
- mFreezeHandler.sendMessage(
- mFreezeHandler.obtainMessage(SET_FROZEN_PROCESS_MSG, DO_UNFREEZE, 0, app));
+ if (!app.frozen) {
+ if (DEBUG_FREEZER) {
+ Slog.d(TAG_AM,
+ "Skipping unfreeze for process " + app.pid + " "
+ + app.processName + " (not frozen)");
+ }
+ return;
+ }
+
+ long freezeTime = app.freezeUnfreezeTime;
+
+ try {
+ Process.setProcessFrozen(app.pid, app.uid, false);
+
+ app.freezeUnfreezeTime = SystemClock.uptimeMillis();
+ app.frozen = false;
+ } catch (Exception e) {
+ Slog.e(TAG_AM, "Unable to unfreeze " + app.pid + " " + app.processName
+ + ". Any related user experience might be hanged.");
+ }
+
+ if (!app.frozen) {
+ if (DEBUG_FREEZER) {
+ Slog.d(TAG_AM, "sync unfroze " + app.pid + " " + app.processName);
+ }
+
+ UnfreezeStats stats = new UnfreezeStats(app.pid, app.processName,
+ app.freezeUnfreezeTime - freezeTime);
+
+ mFreezeHandler.sendMessage(
+ mFreezeHandler.obtainMessage(SET_FROZEN_PROCESS_MSG, REPORT_UNFREEZE, 0,
+ stats));
+ }
}
private static final class LastCompactionStats {
@@ -896,8 +951,8 @@
if (msg.arg1 == DO_FREEZE) {
freezeProcess((ProcessRecord) msg.obj);
- } else if (msg.arg1 == DO_UNFREEZE) {
- unfreezeProcess((ProcessRecord) msg.obj);
+ } else if (msg.arg1 == REPORT_UNFREEZE) {
+ reportUnfreeze((UnfreezeStats) msg.obj);
}
}
@@ -960,61 +1015,18 @@
}
}
- private void unfreezeProcess(ProcessRecord proc) {
- final int pid;
- final String name;
- final long frozenDuration;
- final boolean frozen;
+ private void reportUnfreeze(UnfreezeStats stats) {
- synchronized (mAm) {
- pid = proc.pid;
- name = proc.processName;
+ EventLog.writeEvent(EventLogTags.AM_UNFREEZE, stats.getPid(), stats.getName());
- if (!proc.frozen) {
- if (DEBUG_FREEZER) {
- Slog.d(TAG_AM,
- "Skipping unfreeze for process " + pid + " "
- + name + " (not frozen)");
- }
- return;
- }
-
- if (pid == 0) {
- // Not a real process, either being launched or killed
- return;
- }
-
- long freezeTime = proc.freezeUnfreezeTime;
-
- try {
- Process.setProcessFrozen(proc.pid, proc.uid, false);
-
- proc.freezeUnfreezeTime = SystemClock.uptimeMillis();
- proc.frozen = false;
- } catch (Exception e) {
- Slog.w(TAG_AM, "Unable to unfreeze " + pid + " " + name);
- }
-
- frozenDuration = proc.freezeUnfreezeTime - freezeTime;
- frozen = proc.frozen;
- }
-
- if (!frozen) {
- if (DEBUG_FREEZER) {
- Slog.d(TAG_AM, "unfroze " + pid + " " + name);
- }
-
- EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, name);
-
- // See above for why we're not taking mPhenotypeFlagLock here
- if (mRandom.nextFloat() < mFreezerStatsdSampleRate) {
- FrameworkStatsLog.write(
- FrameworkStatsLog.APP_FREEZE_CHANGED,
- FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP,
- pid,
- name,
- frozenDuration);
- }
+ // See above for why we're not taking mPhenotypeFlagLock here
+ if (mRandom.nextFloat() < mFreezerStatsdSampleRate) {
+ FrameworkStatsLog.write(
+ FrameworkStatsLog.APP_FREEZE_CHANGED,
+ FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP,
+ stats.getPid(),
+ stats.getName(),
+ stats.getFrozenDuration());
}
}
}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index aa37b4a..644f0f7 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -2592,7 +2592,7 @@
if (app.curAdj >= ProcessList.CACHED_APP_MIN_ADJ && !app.frozen) {
mCachedAppOptimizer.freezeAppAsync(app);
} else if (app.setAdj < ProcessList.CACHED_APP_MIN_ADJ && app.frozen) {
- mCachedAppOptimizer.unfreezeAppAsync(app);
+ mCachedAppOptimizer.unfreezeAppLocked(app);
}
}
}