wait_group.hpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright (c) 2016 Klemens D. Morgenstern
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_PROCESS_DETAIL_WINDOWS_WAIT_GROUP_HPP_
  6. #define BOOST_PROCESS_DETAIL_WINDOWS_WAIT_GROUP_HPP_
  7. #include <boost/process/detail/config.hpp>
  8. #include <boost/winapi/jobs.hpp>
  9. #include <boost/winapi/wait.hpp>
  10. #include <chrono>
  11. namespace boost { namespace process { namespace detail { namespace windows {
  12. struct group_handle;
  13. inline void wait(const group_handle &p, std::error_code &ec)
  14. {
  15. if (::boost::winapi::WaitForSingleObject(p.handle(),
  16. ::boost::winapi::infinite) == ::boost::winapi::wait_failed)
  17. ec = get_last_error();
  18. }
  19. inline void wait(const group_handle &p)
  20. {
  21. std::error_code ec;
  22. wait(p, ec);
  23. boost::process::detail::throw_error(ec, "wait error");
  24. }
  25. template< class Clock, class Duration >
  26. inline bool wait_until(
  27. const group_handle &p,
  28. const std::chrono::time_point<Clock, Duration>& timeout_time,
  29. std::error_code &ec)
  30. {
  31. std::chrono::milliseconds ms =
  32. std::chrono::duration_cast<std::chrono::milliseconds>(
  33. timeout_time - Clock::now());
  34. ::boost::winapi::DWORD_ wait_code;
  35. wait_code = ::boost::winapi::WaitForSingleObject(p.handle(), ms.count());
  36. if (wait_code == ::boost::winapi::wait_failed)
  37. ec = get_last_error();
  38. else if (wait_code == ::boost::winapi::wait_timeout)
  39. return false; //
  40. return true;
  41. }
  42. template< class Clock, class Duration >
  43. inline bool wait_until(
  44. const group_handle &p,
  45. const std::chrono::time_point<Clock, Duration>& timeout_time)
  46. {
  47. std::error_code ec;
  48. bool b = wait_until(p, timeout_time, ec);
  49. boost::process::detail::throw_error(ec, "wait_until error");
  50. return b;
  51. }
  52. template< class Rep, class Period >
  53. inline bool wait_for(
  54. const group_handle &p,
  55. const std::chrono::duration<Rep, Period>& rel_time,
  56. std::error_code &ec)
  57. {
  58. return wait_until(p, std::chrono::steady_clock::now() + rel_time, ec);
  59. }
  60. template< class Rep, class Period >
  61. inline bool wait_for(
  62. const group_handle &p,
  63. const std::chrono::duration<Rep, Period>& rel_time)
  64. {
  65. std::error_code ec;
  66. bool b = wait_for(p, rel_time, ec);
  67. boost::process::detail::throw_error(ec, "wait_for error");
  68. return b;
  69. }
  70. }}}}
  71. #endif /* BOOST_PROCESS_DETAIL_WINDOWS_WAIT_GROUP_HPP_ */