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

Commit 4f7cc8c3 authored by Suren Baghdasaryan's avatar Suren Baghdasaryan
Browse files

libprocessgroup: fix boot time performance regression



The way processes are accounted in DoKillProcessGroupOnce has been
changed recently, which affects retries in KillProcessGroup. More specifically, initialPid was not counted before and would not
cause a retry with 5ms sleep.
Restore previous behavior to avoid boot time regressions.

Bug: 271198843
Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
Change-Id: Ibc1bdd855898688a4a03806671e6ac31570aedf9
parent 8dab2ef5
Loading
Loading
Loading
Loading
+4 −7
Original line number Diff line number Diff line
@@ -372,6 +372,7 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid,
    std::set<pid_t> pgids;
    pgids.emplace(initialPid);
    std::set<pid_t> pids;
    int processes = 0;

    std::unique_ptr<FILE, decltype(&fclose)> fd(nullptr, fclose);

@@ -390,6 +391,7 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid,
        pid_t pid;
        bool file_is_empty = true;
        while (fscanf(fd.get(), "%d\n", &pid) == 1 && pid >= 0) {
            processes++;
            file_is_empty = false;
            if (pid == 0) {
                // Should never happen...  but if it does, trying to kill this
@@ -419,15 +421,12 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid,
        }
    }

    int processes = 0;
    // Kill all process groups.
    for (const auto pgid : pgids) {
        LOG(VERBOSE) << "Killing process group " << -pgid << " in uid " << uid
                     << " as part of process cgroup " << initialPid;

        if (kill(-pgid, signal) == 0) {
            processes++;
        } else if (errno != ESRCH) {
        if (kill(-pgid, signal) == -1 && errno != ESRCH) {
            PLOG(WARNING) << "kill(" << -pgid << ", " << signal << ") failed";
        }
    }
@@ -437,9 +436,7 @@ static int DoKillProcessGroupOnce(const char* cgroup, uid_t uid, int initialPid,
        LOG(VERBOSE) << "Killing pid " << pid << " in uid " << uid << " as part of process cgroup "
                     << initialPid;

        if (kill(pid, signal) == 0) {
            processes++;
        } else if (errno != ESRCH) {
        if (kill(pid, signal) == -1 && errno != ESRCH) {
            PLOG(WARNING) << "kill(" << pid << ", " << signal << ") failed";
        }
    }