From 9c6b723adb2341c30fc4958ffa204a941e159d8e Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Mon, 20 Nov 2023 14:38:55 -0800 Subject: [PATCH] init: Introduce the function ReapAndRemove() Prepare for adding a second caller of ReapAndRemove(). Change-Id: I0f54af6136f49caa0198c123a4c8de968e5f41ba Signed-off-by: Bart Van Assche --- init/sigchld_handler.cpp | 27 ++++++++++++++++++--------- init/sigchld_handler.h | 3 ++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/init/sigchld_handler.cpp b/init/sigchld_handler.cpp index 9d4c7c8e3..02795080a 100644 --- a/init/sigchld_handler.cpp +++ b/init/sigchld_handler.cpp @@ -118,8 +118,23 @@ static pid_t ReapOneProcess() { return pid; } -void ReapAnyOutstandingChildren() { - while (ReapOneProcess() != 0) { +std::set ReapAnyOutstandingChildren() { + std::set reaped_pids; + for (;;) { + const pid_t pid = ReapOneProcess(); + if (pid <= 0) { + return reaped_pids; + } + reaped_pids.emplace(pid); + } +} + +static void ReapAndRemove(std::vector& 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& pids, } std::vector 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; } diff --git a/init/sigchld_handler.h b/init/sigchld_handler.h index e07a7d66a..535130296 100644 --- a/init/sigchld_handler.h +++ b/init/sigchld_handler.h @@ -18,12 +18,13 @@ #define _INIT_SIGCHLD_HANDLER_H_ #include +#include #include namespace android { namespace init { -void ReapAnyOutstandingChildren(); +std::set ReapAnyOutstandingChildren(); void WaitToBeReaped(int sigchld_fd, const std::vector& pids, std::chrono::milliseconds timeout);