diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2019-12-05 15:12:59 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2019-12-05 15:12:59 +0900 |
commit | b8cf34c691623e4ec329053cbbf68522a855882d (patch) | |
tree | 34da08632a99677f6b79ecb65e5b655a5b69a67f /boost/process/detail/windows/wait_for_exit.hpp | |
parent | 3fdc3e5ee96dca5b11d1694975a65200787eab86 (diff) | |
download | boost-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/windows/wait_for_exit.hpp')
-rw-r--r-- | boost/process/detail/windows/wait_for_exit.hpp | 140 |
1 files changed, 33 insertions, 107 deletions
diff --git a/boost/process/detail/windows/wait_for_exit.hpp b/boost/process/detail/windows/wait_for_exit.hpp index 4219d9725a..37d24b1aeb 100644 --- a/boost/process/detail/windows/wait_for_exit.hpp +++ b/boost/process/detail/windows/wait_for_exit.hpp @@ -20,21 +20,6 @@ namespace boost { namespace process { namespace detail { namespace windows { -inline void wait(child_handle &p, int & exit_code) -{ - if (::boost::winapi::WaitForSingleObject(p.process_handle(), - ::boost::winapi::infinite) == ::boost::winapi::wait_failed) - throw_last_error("WaitForSingleObject() failed"); - - ::boost::winapi::DWORD_ _exit_code; - if (!::boost::winapi::GetExitCodeProcess(p.process_handle(), &_exit_code)) - throw_last_error("GetExitCodeProcess() failed"); - - ::boost::winapi::CloseHandle(p.proc_info.hProcess); - p.proc_info.hProcess = ::boost::winapi::INVALID_HANDLE_VALUE_; - exit_code = static_cast<int>(_exit_code); -} - inline void wait(child_handle &p, int & exit_code, std::error_code &ec) noexcept { ::boost::winapi::DWORD_ _exit_code = 1; @@ -56,64 +41,40 @@ inline void wait(child_handle &p, int & exit_code, std::error_code &ec) noexcept exit_code = static_cast<int>(_exit_code); } - -template< class Rep, class Period > -inline bool wait_for( - child_handle &p, - int & exit_code, - const std::chrono::duration<Rep, Period>& rel_time) +inline void wait(child_handle &p, int & exit_code) { - - std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(rel_time); - - ::boost::winapi::DWORD_ wait_code; - wait_code = ::boost::winapi::WaitForSingleObject(p.process_handle(), - static_cast<::boost::winapi::DWORD_>(ms.count())); - if (wait_code == ::boost::winapi::wait_failed) - throw_last_error("WaitForSingleObject() failed"); - else if (wait_code == ::boost::winapi::wait_timeout) - return false; // - - ::boost::winapi::DWORD_ _exit_code; - if (!::boost::winapi::GetExitCodeProcess(p.process_handle(), &_exit_code)) - throw_last_error("GetExitCodeProcess() failed"); - - exit_code = static_cast<int>(_exit_code); - ::boost::winapi::CloseHandle(p.proc_info.hProcess); - p.proc_info.hProcess = ::boost::winapi::INVALID_HANDLE_VALUE_; - return true; + std::error_code ec; + wait(p, exit_code, ec); + boost::process::detail::throw_error(ec, "wait error"); } - -template< class Rep, class Period > -inline bool wait_for( +template< class Clock, class Duration > +inline bool wait_until( child_handle &p, int & exit_code, - const std::chrono::duration<Rep, Period>& rel_time, + const std::chrono::time_point<Clock, Duration>& timeout_time, std::error_code &ec) noexcept { - - std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(rel_time); - + std::chrono::milliseconds ms = + std::chrono::duration_cast<std::chrono::milliseconds>( + timeout_time - Clock::now()); ::boost::winapi::DWORD_ wait_code; wait_code = ::boost::winapi::WaitForSingleObject(p.process_handle(), - static_cast<::boost::winapi::DWORD_>(ms.count())); + static_cast<::boost::winapi::DWORD_>(ms.count())); + if (wait_code == ::boost::winapi::wait_failed) ec = std::error_code( ::boost::winapi::GetLastError(), std::system_category()); else if (wait_code == ::boost::winapi::wait_timeout) - return false; // + return false; - ::boost::winapi::DWORD_ _exit_code = 1; + ::boost::winapi::DWORD_ _exit_code; if (!::boost::winapi::GetExitCodeProcess(p.process_handle(), &_exit_code)) - { ec = std::error_code( ::boost::winapi::GetLastError(), std::system_category()); - return false; - } else ec.clear(); @@ -121,7 +82,6 @@ inline bool wait_for( ::boost::winapi::CloseHandle(p.proc_info.hProcess); p.proc_info.hProcess = ::boost::winapi::INVALID_HANDLE_VALUE_; return true; -; } template< class Clock, class Duration > @@ -130,67 +90,33 @@ inline bool wait_until( int & exit_code, const std::chrono::time_point<Clock, Duration>& timeout_time) { - std::chrono::milliseconds ms = - std::chrono::duration_cast<std::chrono::milliseconds>( - timeout_time - std::chrono::system_clock::now()); - - ::boost::winapi::DWORD_ wait_code; - wait_code = ::boost::winapi::WaitForSingleObject(p.process_handle(), - static_cast<::boost::winapi::DWORD_>(ms.count())); - - if (wait_code == ::boost::winapi::wait_failed) - throw_last_error("WaitForSingleObject() failed"); - else if (wait_code == ::boost::winapi::wait_timeout) - return false; - - ::boost::winapi::DWORD_ _exit_code; - if (!::boost::winapi::GetExitCodeProcess(p.process_handle(), &_exit_code)) - throw_last_error("GetExitCodeProcess() failed"); - - exit_code = static_cast<int>(_exit_code); - ::boost::winapi::CloseHandle(p.proc_info.hProcess); - p.proc_info.hProcess = ::boost::winapi::INVALID_HANDLE_VALUE_; - return true; + std::error_code ec; + bool b = wait_until(p, exit_code, timeout_time, ec); + boost::process::detail::throw_error(ec, "wait_until error"); + return b; } - -template< class Clock, class Duration > -inline bool wait_until( +template< class Rep, class Period > +inline bool wait_for( child_handle &p, int & exit_code, - const std::chrono::time_point<Clock, Duration>& timeout_time, + const std::chrono::duration<Rep, Period>& rel_time, std::error_code &ec) noexcept { - std::chrono::milliseconds ms = - std::chrono::duration_cast<std::chrono::milliseconds>( - timeout_time - std::chrono::system_clock::now()); - - ::boost::winapi::DWORD_ wait_code; - wait_code = ::boost::winapi::WaitForSingleObject(p.process_handle(), - static_cast<::boost::winapi::DWORD_>(ms.count())); - - if (wait_code == ::boost::winapi::wait_failed) - ec = std::error_code( - ::boost::winapi::GetLastError(), - std::system_category()); - else if (wait_code == ::boost::winapi::wait_timeout) - return false; - - ::boost::winapi::DWORD_ _exit_code; - if (!::boost::winapi::GetExitCodeProcess(p.process_handle(), &_exit_code)) - ec = std::error_code( - ::boost::winapi::GetLastError(), - std::system_category()); - else - ec.clear(); - - exit_code = static_cast<int>(_exit_code); - ::boost::winapi::CloseHandle(p.proc_info.hProcess); - p.proc_info.hProcess = ::boost::winapi::INVALID_HANDLE_VALUE_; - return true; -; + return wait_until(p, exit_code, std::chrono::steady_clock::now() + rel_time, ec); } +template< class Rep, class Period > +inline bool wait_for( + child_handle &p, + int & exit_code, + const std::chrono::duration<Rep, Period>& rel_time) +{ + std::error_code ec; + bool b = wait_for(p, exit_code, rel_time, ec); + boost::process::detail::throw_error(ec, "wait_for error"); + return b; +} }}}} |