summaryrefslogtreecommitdiff
path: root/boost/process/detail/posix/sigchld_service.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:12:59 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:12:59 +0900
commitb8cf34c691623e4ec329053cbbf68522a855882d (patch)
tree34da08632a99677f6b79ecb65e5b655a5b69a67f /boost/process/detail/posix/sigchld_service.hpp
parent3fdc3e5ee96dca5b11d1694975a65200787eab86 (diff)
downloadboost-b8cf34c691623e4ec329053cbbf68522a855882d.tar.gz
boost-b8cf34c691623e4ec329053cbbf68522a855882d.tar.bz2
boost-b8cf34c691623e4ec329053cbbf68522a855882d.zip
Imported Upstream version 1.67.0upstream/1.67.0
Diffstat (limited to 'boost/process/detail/posix/sigchld_service.hpp')
-rw-r--r--boost/process/detail/posix/sigchld_service.hpp31
1 files changed, 20 insertions, 11 deletions
diff --git a/boost/process/detail/posix/sigchld_service.hpp b/boost/process/detail/posix/sigchld_service.hpp
index 7fee01e075..108b2b3fba 100644
--- a/boost/process/detail/posix/sigchld_service.hpp
+++ b/boost/process/detail/posix/sigchld_service.hpp
@@ -77,19 +77,28 @@ void sigchld_service::_handle_signal(const boost::system::error_code & ec)
r.second(-1, ec_);
return;
}
- int status;
- int pid = ::waitpid(0, &status, WNOHANG);
- auto itr = std::find_if(_receivers.begin(), _receivers.end(),
- [&pid](const std::pair<::pid_t, std::function<void(int, std::error_code)>> & p)
- {
- return p.first == pid;
- });
- if (itr != _receivers.cend())
- {
- _strand.get_io_context().wrap(itr->second)(status, ec_);
- _receivers.erase(itr);
+ for (auto & r : _receivers) {
+ int status;
+ int pid = ::waitpid(r.first, &status, WNOHANG);
+ if (pid < 0) {
+ // error (eg: the process no longer exists)
+ r.second(-1, get_last_error());
+ r.first = 0; // mark for deletion
+ } else if (pid == r.first) {
+ r.second(status, ec_);
+ r.first = 0; // mark for deletion
+ }
+ // otherwise the process is still around
}
+
+ _receivers.erase(std::remove_if(_receivers.begin(), _receivers.end(),
+ [](const std::pair<::pid_t, std::function<void(int, std::error_code)>> & p)
+ {
+ return p.first == 0;
+ }),
+ _receivers.end());
+
if (!_receivers.empty())
{
_signal_set.async_wait(