diff options
| author | 2016-08-19 17:06:53 +0000 | |
|---|---|---|
| committer | 2016-08-19 17:06:55 +0000 | |
| commit | b51e98becbca9c28e37d9806124ecebf6f8d7dd0 (patch) | |
| tree | 6d2c7cdabf1950d29afeeb980a16a47e87e12762 | |
| parent | 2d71384a139ae27cbc7b57f06662bf6ee2010f2b (diff) | |
| parent | d1eeb5b7b489d47994a71510f1ed5b97b8e32a7a (diff) | |
Merge "DO NOT MERGE: Clean up when recycling a pid with a pending launch" into mnc-dev
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 21 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/BroadcastQueue.java | 5 | 
2 files changed, 22 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index d9d0f20ca1e6..8540f2a8fc13 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3375,6 +3375,15 @@ public final class ActivityManagerService extends ActivityManagerNative              app.killedByAm = false;              checkTime(startTime, "startProcess: starting to update pids map");              synchronized (mPidsSelfLocked) { +                ProcessRecord oldApp; +                // If there is already an app occupying that pid that hasn't been cleaned up +                if ((oldApp = mPidsSelfLocked.get(startResult.pid)) != null && !app.isolated) { +                    // Clean up anything relating to this pid first +                    Slog.w(TAG, "Reusing pid " + startResult.pid +                            + " while app is still mapped to it"); +                    cleanUpApplicationRecordLocked(oldApp, false, false, -1, +                            true /*replacingPid*/); +                }                  this.mPidsSelfLocked.put(startResult.pid, app);                  if (isActivityProcess) {                      Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG); @@ -4515,7 +4524,8 @@ public final class ActivityManagerService extends ActivityManagerNative      private final void handleAppDiedLocked(ProcessRecord app,              boolean restarting, boolean allowRestart) {          int pid = app.pid; -        boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1); +        boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1, +                false /*replacingPid*/);          if (!kept && !restarting) {              removeLruProcessLocked(app);              if (pid > 0) { @@ -15441,7 +15451,8 @@ public final class ActivityManagerService extends ActivityManagerNative       * app that was passed in must remain on the process lists.       */      private final boolean cleanUpApplicationRecordLocked(ProcessRecord app, -            boolean restarting, boolean allowRestart, int index) { +            boolean restarting, boolean allowRestart, int index, boolean replacingPid) { +        Slog.d(TAG, "cleanUpApplicationRecord -- " + app.pid);          if (index >= 0) {              removeLruProcessLocked(app);              ProcessList.remove(app.pid); @@ -15571,7 +15582,9 @@ public final class ActivityManagerService extends ActivityManagerNative          if (!app.persistent || app.isolated) {              if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_CLEANUP,                      "Removing non-persistent process during cleanup: " + app); -            removeProcessNameLocked(app.processName, app.uid); +            if (!replacingPid) { +                removeProcessNameLocked(app.processName, app.uid); +            }              if (mHeavyWeightProcess == app) {                  mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG,                          mHeavyWeightProcess.userId, 0)); @@ -19402,7 +19415,7 @@ public final class ActivityManagerService extends ActivityManagerNative                              // Ignore exceptions.                          }                      } -                    cleanUpApplicationRecordLocked(app, false, true, -1); +                    cleanUpApplicationRecordLocked(app, false, true, -1, false /*replacingPid*/);                      mRemovedProcesses.remove(i);                      if (app.persistent) { diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 960cbf15a96e..c56f5917838e 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -291,6 +291,11 @@ public final class BroadcastQueue {          boolean didSomething = false;          final BroadcastRecord br = mPendingBroadcast;          if (br != null && br.curApp.pid == app.pid) { +            if (br.curApp != app) { +                Slog.e(TAG, "App mismatch when sending pending broadcast to " +                        + app.processName + ", intended target is " + br.curApp.processName); +                return false; +            }              try {                  mPendingBroadcast = null;                  processCurBroadcastLocked(br, app);  |