DO NOT MERGE: Clean up when recycling a pid with a pending launch
am: a3af5c6207
Change-Id: Ibdd69f2fa346dc31224fa6357718f56aa26ded1d
This commit is contained in:
@@ -2819,6 +2819,15 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
app.usingWrapper = startResult.usingWrapper;
|
app.usingWrapper = startResult.usingWrapper;
|
||||||
app.removed = false;
|
app.removed = false;
|
||||||
synchronized (mPidsSelfLocked) {
|
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);
|
this.mPidsSelfLocked.put(startResult.pid, app);
|
||||||
Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
|
Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
|
||||||
msg.obj = app;
|
msg.obj = app;
|
||||||
@@ -3608,7 +3617,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
*/
|
*/
|
||||||
private final void handleAppDiedLocked(ProcessRecord app,
|
private final void handleAppDiedLocked(ProcessRecord app,
|
||||||
boolean restarting, boolean allowRestart) {
|
boolean restarting, boolean allowRestart) {
|
||||||
cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1);
|
cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1,
|
||||||
|
false /*replacingPid*/);
|
||||||
if (!restarting) {
|
if (!restarting) {
|
||||||
removeLruProcessLocked(app);
|
removeLruProcessLocked(app);
|
||||||
}
|
}
|
||||||
@@ -12395,7 +12405,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
* a process when running in single process mode.
|
* a process when running in single process mode.
|
||||||
*/
|
*/
|
||||||
private final void cleanUpApplicationRecordLocked(ProcessRecord app,
|
private final void cleanUpApplicationRecordLocked(ProcessRecord app,
|
||||||
boolean restarting, boolean allowRestart, int index) {
|
boolean restarting, boolean allowRestart, int index, boolean replacingPid) {
|
||||||
|
Slog.d(TAG, "cleanUpApplicationRecordLocked -- " + app.pid);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
removeLruProcessLocked(app);
|
removeLruProcessLocked(app);
|
||||||
}
|
}
|
||||||
@@ -12519,8 +12530,10 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
if (!app.persistent || app.isolated) {
|
if (!app.persistent || app.isolated) {
|
||||||
if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG,
|
if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG,
|
||||||
"Removing non-persistent process during cleanup: " + app);
|
"Removing non-persistent process during cleanup: " + app);
|
||||||
mProcessNames.remove(app.processName, app.uid);
|
if (!replacingPid) {
|
||||||
mIsolatedProcesses.remove(app.uid);
|
mProcessNames.remove(app.processName, app.uid);
|
||||||
|
mIsolatedProcesses.remove(app.uid);
|
||||||
|
}
|
||||||
if (mHeavyWeightProcess == app) {
|
if (mHeavyWeightProcess == app) {
|
||||||
mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG,
|
mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG,
|
||||||
mHeavyWeightProcess.userId, 0));
|
mHeavyWeightProcess.userId, 0));
|
||||||
@@ -15818,7 +15831,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
|||||||
// Ignore exceptions.
|
// Ignore exceptions.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cleanUpApplicationRecordLocked(app, false, true, -1);
|
cleanUpApplicationRecordLocked(app, false, true, -1, false /*replacingPid*/);
|
||||||
mRemovedProcesses.remove(i);
|
mRemovedProcesses.remove(i);
|
||||||
|
|
||||||
if (app.persistent) {
|
if (app.persistent) {
|
||||||
|
|||||||
@@ -255,6 +255,11 @@ public final class BroadcastQueue {
|
|||||||
boolean didSomething = false;
|
boolean didSomething = false;
|
||||||
final BroadcastRecord br = mPendingBroadcast;
|
final BroadcastRecord br = mPendingBroadcast;
|
||||||
if (br != null && br.curApp.pid == app.pid) {
|
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 {
|
try {
|
||||||
mPendingBroadcast = null;
|
mPendingBroadcast = null;
|
||||||
processCurBroadcastLocked(br, app);
|
processCurBroadcastLocked(br, app);
|
||||||
|
|||||||
Reference in New Issue
Block a user