Merge "Process: Fix communication with zygote." into klp-dev am: 6829cf28e2 am: 8fdee85e87 am: 4cf5241f47 am: efab128e67 am: 86437ec433
am: 4d7740907e
Change-Id: If0e46bb3e4fd182a46b714e0e9140deac8fc470e
This commit is contained in:
@@ -3101,6 +3101,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);
|
||||
@@ -4591,7 +4600,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) {
|
||||
@@ -14978,7 +14988,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);
|
||||
@@ -15108,8 +15119,10 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
if (!app.persistent || app.isolated) {
|
||||
if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG,
|
||||
"Removing non-persistent process during cleanup: " + app);
|
||||
mProcessNames.remove(app.processName, app.uid);
|
||||
mIsolatedProcesses.remove(app.uid);
|
||||
if (!replacingPid) {
|
||||
mProcessNames.remove(app.processName, app.uid);
|
||||
mIsolatedProcesses.remove(app.uid);
|
||||
}
|
||||
if (mHeavyWeightProcess == app) {
|
||||
mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG,
|
||||
mHeavyWeightProcess.userId, 0));
|
||||
@@ -18671,7 +18684,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) {
|
||||
|
||||
@@ -264,6 +264,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);
|
||||
|
||||
Reference in New Issue
Block a user