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:
parent
142f8129ec
commit
9c6b723adb
2 changed files with 20 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue