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

Commit c93c5eff authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "init: Introduce the function ReapAndRemove()" into main

parents 1056a117 9c6b723a
Loading
Loading
Loading
Loading
+18 −9
Original line number Diff line number Diff line
@@ -118,8 +118,23 @@ static pid_t ReapOneProcess() {
    return pid;
}

void ReapAnyOutstandingChildren() {
    while (ReapOneProcess() != 0) {
std::set<pid_t> ReapAnyOutstandingChildren() {
    std::set<pid_t> reaped_pids;
    for (;;) {
        const pid_t pid = ReapOneProcess();
        if (pid <= 0) {
            return reaped_pids;
        }
        reaped_pids.emplace(pid);
    }
}

static void ReapAndRemove(std::vector<pid_t>& alive_pids) {
    for (auto pid : ReapAnyOutstandingChildren()) {
        const auto it = std::find(alive_pids.begin(), alive_pids.end(), pid);
        if (it != alive_pids.end()) {
            alive_pids.erase(it);
        }
    }
}

@@ -142,13 +157,7 @@ void WaitToBeReaped(int sigchld_fd, const std::vector<pid_t>& pids,
    }
    std::vector<pid_t> alive_pids(pids.begin(), pids.end());
    while (!alive_pids.empty() && t.duration() < timeout) {
        pid_t pid;
        while ((pid = ReapOneProcess()) != 0) {
            auto it = std::find(alive_pids.begin(), alive_pids.end(), pid);
            if (it != alive_pids.end()) {
                alive_pids.erase(it);
            }
        }
        ReapAndRemove(alive_pids);
        if (alive_pids.empty()) {
            break;
        }
+2 −1
Original line number Diff line number Diff line
@@ -18,12 +18,13 @@
#define _INIT_SIGCHLD_HANDLER_H_

#include <chrono>
#include <set>
#include <vector>

namespace android {
namespace init {

void ReapAnyOutstandingChildren();
std::set<pid_t> ReapAnyOutstandingChildren();

void WaitToBeReaped(int sigchld_fd, const std::vector<pid_t>& pids,
                    std::chrono::milliseconds timeout);