Merge "Scan the downstream apps while updating oomadj for pending records" into sc-dev

This commit is contained in:
Hui Yu
2021-05-14 06:41:56 +00:00
committed by Android (Google) Code Review

View File

@@ -511,6 +511,7 @@ public class OomAdjuster {
final ProcessRecord topApp = mService.getTopApp();
final ProcessStateRecord state = app.mState;
final boolean wasCached = state.isCached();
final int oldCap = state.getSetCapability();
mAdjSeq++;
@@ -526,6 +527,7 @@ public class OomAdjuster {
SystemClock.uptimeMillis());
if (oomAdjAll
&& (wasCached != state.isCached()
|| oldCap != state.getSetCapability()
|| state.getCurRawAdj() == ProcessList.UNKNOWN_ADJ)) {
// Changed to/from cached state, so apps after it in the LRU
// list may also be changed.
@@ -663,6 +665,7 @@ public class OomAdjuster {
? oldAdj : ProcessList.UNKNOWN_ADJ;
final boolean wasBackground = ActivityManager.isProcStateBackground(
state.getSetProcState());
final int oldCap = state.getSetCapability();
state.setContainsCycle(false);
state.setProcStateChanged(false);
state.resetCachedInfo();
@@ -671,6 +674,7 @@ public class OomAdjuster {
boolean success = performUpdateOomAdjLSP(app, cachedAdj, topApp, false,
SystemClock.uptimeMillis());
if (!success || (wasCached == state.isCached() && oldAdj != ProcessList.INVALID_ADJ
&& oldCap == state.getCurCapability()
&& wasBackground == ActivityManager.isProcStateBackground(
state.getSetProcState()))) {
// Okay, it's unchanged, it won't impact any service it binds to, we're done here.
@@ -685,20 +689,60 @@ public class OomAdjuster {
// Next to find out all its reachable processes
ArrayList<ProcessRecord> processes = mTmpProcessList;
ActiveUids uids = mTmpUidRecords;
ArrayDeque<ProcessRecord> queue = mTmpQueue;
mPendingProcessSet.add(app);
boolean containsCycle = collectReachableProcessesLocked(mPendingProcessSet,
processes, uids);
// Reset the flag
state.setReachable(false);
// Remove this app from the return list because we've done the computation on it.
processes.remove(app);
int size = processes.size();
if (size > 0) {
mAdjSeq--;
// Update these reachable processes
updateOomAdjInnerLSP(oomAdjReason, topApp, processes, uids, containsCycle, false);
} else if (state.getCurRawAdj() == ProcessList.UNKNOWN_ADJ) {
// In case the app goes from non-cached to cached but it doesn't have other reachable
// processes, its adj could be still unknown as of now, assign one.
processes.add(app);
assignCachedAdjIfNecessary(processes);
applyOomAdjLSP(app, false, SystemClock.uptimeMillis(),
SystemClock.elapsedRealtime());
}
mTmpProcessList.clear();
mService.mOomAdjProfiler.oomAdjEnded();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
return true;
}
@GuardedBy("mService")
private boolean collectReachableProcessesLocked(ArraySet<ProcessRecord> apps,
ArrayList<ProcessRecord> processes, ActiveUids uids) {
final ArrayDeque<ProcessRecord> queue = mTmpQueue;
queue.clear();
for (int i = 0, size = apps.size(); i < size; i++) {
final ProcessRecord app = apps.valueAt(i);
app.mState.setReachable(true);
queue.offer(app);
}
return collectReachableProcessesLocked(queue, processes, uids);
}
@GuardedBy("mService")
private boolean collectReachableProcessesLocked(ArrayDeque<ProcessRecord> queue,
ArrayList<ProcessRecord> processes, ActiveUids uids) {
processes.clear();
uids.clear();
queue.clear();
// Track if any of them reachables could include a cycle
boolean containsCycle = false;
// Scan downstreams of the process record
state.setReachable(true);
for (ProcessRecord pr = app; pr != null; pr = queue.poll()) {
if (pr != app) {
processes.add(pr);
}
for (ProcessRecord pr = queue.poll(); pr != null; pr = queue.poll()) {
processes.add(pr);
final UidRecord uidRec = pr.getUidRecord();
if (uidRec != null) {
uids.put(uidRec.getUid(), uidRec);
@@ -749,8 +793,6 @@ public class OomAdjuster {
}
}
// Reset the flag
state.setReachable(false);
int size = processes.size();
if (size > 0) {
// Reverse the process list, since the updateOomAdjInnerLSP scans from the end of it.
@@ -759,21 +801,8 @@ public class OomAdjuster {
processes.set(l, processes.get(r));
processes.set(r, t);
}
mAdjSeq--;
// Update these reachable processes
updateOomAdjInnerLSP(oomAdjReason, topApp, processes, uids, containsCycle, false);
} else if (state.getCurRawAdj() == ProcessList.UNKNOWN_ADJ) {
// In case the app goes from non-cached to cached but it doesn't have other reachable
// processes, its adj could be still unknown as of now, assign one.
processes.add(app);
assignCachedAdjIfNecessary(processes);
applyOomAdjLSP(app, false, SystemClock.uptimeMillis(),
SystemClock.elapsedRealtime());
}
mTmpProcessList.clear();
mService.mOomAdjProfiler.oomAdjEnded();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
return true;
return containsCycle;
}
/**
@@ -857,18 +886,8 @@ public class OomAdjuster {
final ArrayList<ProcessRecord> processes = mTmpProcessList;
final ActiveUids uids = mTmpUidRecords;
collectReachableProcessesLocked(mPendingProcessSet, processes, uids);
synchronized (mProcLock) {
uids.clear();
processes.clear();
for (int i = mPendingProcessSet.size() - 1; i >= 0; i--) {
final ProcessRecord app = mPendingProcessSet.valueAt(i);
final UidRecord uidRec = app.getUidRecord();
if (uidRec != null) {
uids.put(uidRec.getUid(), uidRec);
}
processes.add(app);
}
updateOomAdjInnerLSP(oomAdjReason, topApp, processes, uids, true, false);
}
processes.clear();