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; final Process.ProcessStartResult startResult;
boolean regularZygote = false; boolean regularZygote = false;
app.mProcessGroupCreated = false;
app.mSkipProcessGroupCreation = false;
if (hostingRecord.usesWebviewZygote()) { if (hostingRecord.usesWebviewZygote()) {
startResult = startWebView(entryPoint, startResult = startWebView(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.processName, uid, uid, gids, runtimeFlags, mountExternal,
@@ -2328,18 +2330,28 @@ public final class ProcessList {
isTopApp, app.getDisabledCompatChanges(), pkgDataInfoMap, isTopApp, app.getDisabledCompatChanges(), pkgDataInfoMap,
allowlistedAppDataInfoMap, bindMountAppsData, bindMountAppStorageDirs, allowlistedAppDataInfoMap, bindMountAppsData, bindMountAppStorageDirs,
new String[]{PROC_START_SEQ_IDENT + app.getStartSeq()}); new String[]{PROC_START_SEQ_IDENT + app.getStartSeq()});
// By now the process group should have been created by zygote.
app.mProcessGroupCreated = true;
} }
if (!regularZygote) { if (!regularZygote) {
// webview and app zygote don't have the permission to create the nodes // webview and app zygote don't have the permission to create the nodes
final int res = Process.createProcessGroup(uid, startResult.pid); synchronized (app) {
if (res < 0) { if (!app.mSkipProcessGroupCreation) {
if (res == -OsConstants.ESRCH) { // If we're not told to skip the process group creation, go create it.
Slog.e(ActivityManagerService.TAG, "Unable to create process group for " final int res = Process.createProcessGroup(uid, startResult.pid);
+ app.processName + " (" + startResult.pid + ")"); if (res < 0) {
} else { if (res == -OsConstants.ESRCH) {
throw new AssertionError("Unable to create process group for " Slog.e(ActivityManagerService.TAG,
+ app.processName + " (" + startResult.pid + ")"); "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; 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, void setStartParams(int startUid, HostingRecord hostingRecord, String seInfo,
long startUptime, long startElapsedTime) { long startUptime, long startElapsedTime) {
this.mStartUid = startUid; this.mStartUid = startUid;
@@ -1192,8 +1202,26 @@ class ProcessRecord implements WindowProcessListener {
EventLog.writeEvent(EventLogTags.AM_KILL, EventLog.writeEvent(EventLogTags.AM_KILL,
userId, mPid, processName, mState.getSetAdj(), reason); userId, mPid, processName, mState.getSetAdj(), reason);
Process.killProcessQuiet(mPid); Process.killProcessQuiet(mPid);
if (!asyncKPG) Process.sendSignalToProcessGroup(uid, mPid, OsConstants.SIGKILL); final boolean killProcessGroup;
ProcessList.killProcessGroup(uid, mPid); 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 { } else {
mPendingStart = false; mPendingStart = false;
} }