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>
diff --git a/init/sigchld_handler.cpp b/init/sigchld_handler.cpp
index 9d4c7c8..0279508 100644
--- a/init/sigchld_handler.cpp
+++ b/init/sigchld_handler.cpp
@@ -118,8 +118,23 @@
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 @@
}
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;
}