Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 405ff3e8 authored by Jing Ji's avatar Jing Ji Committed by Automerger Merge Worker
Browse files

Merge "Fix the race condition between creating and killing process group" into...

Merge "Fix the race condition between creating and killing process group" into udc-dev am: c601737f am: 05a6e7e1

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22970327



Change-Id: I93d51ce377178d5bdaa1ef8ebe1ccb31163df5c4
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 6f6d7f6b 05a6e7e1
Loading
Loading
Loading
Loading
+20 −8
Original line number Diff line number Diff line
@@ -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,19 +2330,29 @@ 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
                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 "
                                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;
                        }
                    }
                }
            }

+30 −2
Original line number Diff line number Diff line
@@ -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);
                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;
            }