init: Introduce the function ReapAndRemove()

Prepare for adding a second caller of ReapAndRemove().

Change-Id: I0f54af6136f49caa0198c123a4c8de968e5f41ba
Signed-off-by: Bart Van Assche <bvanassche@google.com>
This commit is contained in:
Bart Van Assche 2023-11-20 14:38:55 -08:00
parent 142f8129ec
commit 9c6b723adb
2 changed files with 20 additions and 10 deletions

View file

@ -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;
}

View file

@ -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);