summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2018-10-02 00:19:18 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-10-02 00:19:18 +0000
commit2bbdc1bb0c41b85274db389cf9f7426c5cdd0f77 (patch)
tree04a4ae74d5e6de71493ebf7fd3c60ae2dbcc3160
parent32aa6c0ae306fa2d55fab34c6f17108a410668a0 (diff)
parent0e59263c9a98b535f778b3f1162b23ffc351f672 (diff)
Merge "Fix a race in AMS.getContentProviderImpl()."
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java18
1 files changed, 17 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a3a5ac8b5999..f49c50a68674 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -7641,7 +7641,23 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- boolean providerRunning = cpr != null && cpr.proc != null && !cpr.proc.killed;
+ boolean providerRunning = false;
+
+ if (cpr != null && cpr.proc != null) {
+ providerRunning = !cpr.proc.killed;
+
+ // Note if killedByAm is also set, this means the provider process has just been
+ // killed by AM (in ProcessRecord.kill()), but appDiedLocked() hasn't been called
+ // yet. So we need to call appDiedLocked() here and let it clean up.
+ // (See the commit message on I2c4ba1e87c2d47f2013befff10c49b3dc337a9a7 to see
+ // how to test this case.)
+ if (cpr.proc.killed && cpr.proc.killedByAm) {
+ checkTime(startTime, "getContentProviderImpl: before appDied (killedByAm)");
+ appDiedLocked(cpr.proc);
+ checkTime(startTime, "getContentProviderImpl: after appDied (killedByAm)");
+ }
+ }
+
if (providerRunning) {
cpi = cpr.info;
String msg;