summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jing Ji <jji@google.com> 2023-06-09 13:55:21 -0700
committer Jing Ji <jji@google.com> 2023-06-09 13:55:21 -0700
commit3ffec4f568318f6cc6fd131f06cbab8099f10b31 (patch)
tree66eae33ef1f966a131104c8d15c7e20ebfe63f5c
parent0bc1b58227c35667985e9fe0f823e2d2b0f6d78b (diff)
Do not reuse the same ProcessRecord if it's not fully gone yet
When force-stopping apps, it's eligible for restart, and during that we might be reusing the old ProcessRecord before that process is really gone. Now don't reuse that. And also, remove the ProcessRecord from the LRU list when we know it's really gone. Bug: 286299952 Test: Manual - Clear app data and make sure it could restart correctly. Change-Id: I2c71c64b962cb9b4ae15881add50c35fd9e4a7af
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java9
1 files changed, 8 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 4342cb994754..0027e7b72bef 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -2572,9 +2572,14 @@ public final class ProcessList {
// and did the cleanup before the actual death notification. Check the dying processes.
predecessor = mDyingProcesses.get(processName, info.uid);
if (predecessor != null) {
- if (app != null) {
+ // The process record could have existed but its pid is set to 0. In this case,
+ // the 'app' and 'predecessor' could end up pointing to the same instance;
+ // so make sure we check this case here.
+ if (app != null && app != predecessor) {
app.mPredecessor = predecessor;
predecessor.mSuccessor = app;
+ } else {
+ app = null;
}
Slog.w(TAG_PROCESSES, predecessor.toString() + " is attached to a previous process "
+ predecessor.getDyingPid());
@@ -5195,6 +5200,8 @@ public final class ProcessList {
mDyingProcesses.remove(app.processName, app.uid);
app.setDyingPid(0);
handlePrecedingAppDiedLocked(app);
+ // Remove from the LRU list if it's still there.
+ removeLruProcessLocked(app);
return true;
}
return false;