Merge "Fix the race condition between creating and killing process group" into udc-dev

This commit is contained in:
Jing Ji
2023-05-05 01:39:37 +00:00
committed by Android (Google) Code Review
2 changed files with 50 additions and 10 deletions

View File

@@ -2300,6 +2300,8 @@ public final class ProcessList {
final Process.ProcessStartResult startResult;
boolean regularZygote = false;
app.mProcessGroupCreated = false;
app.mSkipProcessGroupCreation = false;
if (hostingRecord.usesWebviewZygote()) {
startResult = startWebView(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
@@ -2328,18 +2330,28 @@ public final class ProcessList {
isTopApp, app.getDisabledCompatChanges(), pkgDataInfoMap,
allowlistedAppDataInfoMap, bindMountAppsData, bindMountAppStorageDirs,
new String[]{PROC_START_SEQ_IDENT + app.getStartSeq()});
// By now the process group should have been created by zygote.
app.mProcessGroupCreated = true;
}
if (!regularZygote) {
// webview and app zygote don't have the permission to create the nodes
final int res = Process.createProcessGroup(uid, startResult.pid);
if (res < 0) {
if (res == -OsConstants.ESRCH) {
Slog.e(ActivityManagerService.TAG, "Unable to create process group for "
+ app.processName + " (" + startResult.pid + ")");
} else {
throw new AssertionError("Unable to create process group for "
+ app.processName + " (" + startResult.pid + ")");
synchronized (app) {
if (!app.mSkipProcessGroupCreation) {
// If we're not told to skip the process group creation, go create it.
final int res = Process.createProcessGroup(uid, startResult.pid);
if (res < 0) {
if (res == -OsConstants.ESRCH) {
Slog.e(ActivityManagerService.TAG,
"Unable to create process group for "
+ app.processName + " (" + startResult.pid + ")");
} else {
throw new AssertionError("Unable to create process group for "
+ app.processName + " (" + startResult.pid + ")");
}
} else {
app.mProcessGroupCreated = true;
}
}
}
}

View File

@@ -424,6 +424,16 @@ class ProcessRecord implements WindowProcessListener {
*/
Runnable mSuccessorStartRunnable;
/**
* Whether or not the process group of this process has been created.
*/
volatile boolean mProcessGroupCreated;
/**
* Whether or not we should skip the process group creation.
*/
volatile boolean mSkipProcessGroupCreation;
void setStartParams(int startUid, HostingRecord hostingRecord, String seInfo,
long startUptime, long startElapsedTime) {
this.mStartUid = startUid;
@@ -1192,8 +1202,26 @@ class ProcessRecord implements WindowProcessListener {
EventLog.writeEvent(EventLogTags.AM_KILL,
userId, mPid, processName, mState.getSetAdj(), reason);
Process.killProcessQuiet(mPid);
if (!asyncKPG) Process.sendSignalToProcessGroup(uid, mPid, OsConstants.SIGKILL);
ProcessList.killProcessGroup(uid, mPid);
final boolean killProcessGroup;
if (mHostingRecord != null
&& (mHostingRecord.usesWebviewZygote() || mHostingRecord.usesAppZygote())) {
synchronized (ProcessRecord.this) {
killProcessGroup = mProcessGroupCreated;
if (!killProcessGroup) {
// The process group hasn't been created, request to skip it.
mSkipProcessGroupCreation = true;
}
}
} else {
killProcessGroup = true;
}
if (killProcessGroup) {
if (asyncKPG) {
ProcessList.killProcessGroup(uid, mPid);
} else {
Process.sendSignalToProcessGroup(uid, mPid, OsConstants.SIGKILL);
}
}
} else {
mPendingStart = false;
}