diff options
| author | 2018-10-02 00:19:18 +0000 | |
|---|---|---|
| committer | 2018-10-02 00:19:18 +0000 | |
| commit | 2bbdc1bb0c41b85274db389cf9f7426c5cdd0f77 (patch) | |
| tree | 04a4ae74d5e6de71493ebf7fd3c60ae2dbcc3160 | |
| parent | 32aa6c0ae306fa2d55fab34c6f17108a410668a0 (diff) | |
| parent | 0e59263c9a98b535f778b3f1162b23ffc351f672 (diff) | |
Merge "Fix a race in AMS.getContentProviderImpl()."
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 18 |
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; |