Imported Upstream version 1.64.0
[platform/upstream/boost.git] / boost / process / detail / windows / wait_group.hpp
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
6 #ifndef BOOST_PROCESS_DETAIL_WINDOWS_WAIT_GROUP_HPP_
7 #define BOOST_PROCESS_DETAIL_WINDOWS_WAIT_GROUP_HPP_
8
9 #include <boost/process/detail/config.hpp>
10 #include <boost/detail/winapi/jobs.hpp>
11 #include <boost/detail/winapi/wait.hpp>
12
13
14 namespace boost { namespace process { namespace detail { namespace windows {
15
16 struct group_handle;
17
18 inline void wait(const group_handle &p)
19 {
20     if (::boost::detail::winapi::WaitForSingleObject(p.handle(),
21         ::boost::detail::winapi::infinite) == ::boost::detail::winapi::wait_failed)
22             throw_last_error("WaitForSingleObject() failed");
23
24 }
25
26 inline void wait(const group_handle &p, std::error_code &ec)
27 {
28     if (::boost::detail::winapi::WaitForSingleObject(p.handle(),
29         ::boost::detail::winapi::infinite) == ::boost::detail::winapi::wait_failed)
30             ec = get_last_error();
31 }
32
33
34 template< class Rep, class Period >
35 inline bool wait_for(
36         const group_handle &p,
37         const std::chrono::duration<Rep, Period>& rel_time)
38 {
39
40     std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(rel_time);
41
42     ::boost::detail::winapi::DWORD_ wait_code;
43     wait_code = ::boost::detail::winapi::WaitForSingleObject(p.handle(), ms.count());
44     if (wait_code == ::boost::detail::winapi::wait_failed)
45         throw_last_error("WaitForSingleObject() failed");
46     else if (wait_code == ::boost::detail::winapi::wait_timeout)
47         return false; //
48
49     return true;
50 }
51
52
53 template< class Rep, class Period >
54 inline bool wait_for(
55         const group_handle &p,
56         const std::chrono::duration<Rep, Period>& rel_time,
57         std::error_code &ec)
58 {
59
60     std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(rel_time);
61
62
63     ::boost::detail::winapi::DWORD_ wait_code;
64     wait_code = ::boost::detail::winapi::WaitForSingleObject(p.handle(), ms.count());
65     if (wait_code == ::boost::detail::winapi::wait_failed)
66         ec = get_last_error();
67
68     else if (wait_code == ::boost::detail::winapi::wait_timeout)
69         return false; //
70
71     return true;
72 }
73
74 template< class Clock, class Duration >
75 inline bool wait_until(
76         const group_handle &p,
77         const std::chrono::time_point<Clock, Duration>& timeout_time)
78 {
79     std::chrono::milliseconds ms =
80             std::chrono::duration_cast<std::chrono::milliseconds>(
81                     timeout_time - std::chrono::system_clock::now());
82
83     ::boost::detail::winapi::DWORD_ wait_code;
84     wait_code = ::boost::detail::winapi::WaitForSingleObject(p.handle(), ms.count());
85
86     if (wait_code == ::boost::detail::winapi::wait_failed)
87         throw_last_error("WaitForSingleObject() failed");
88
89     else if (wait_code == ::boost::detail::winapi::wait_timeout)
90         return false; //
91
92     return true;
93 }
94
95
96 template< class Clock, class Duration >
97 inline bool wait_until(
98         const group_handle &p,
99         const std::chrono::time_point<Clock, Duration>& timeout_time,
100         std::error_code &ec)
101 {
102     std::chrono::milliseconds ms =
103             std::chrono::duration_cast<std::chrono::milliseconds>(
104                     timeout_time - std::chrono::system_clock::now());
105
106     ::boost::detail::winapi::DWORD_ wait_code;
107     wait_code = ::boost::detail::winapi::WaitForSingleObject(p.handle(), ms.count());
108
109     if (wait_code == ::boost::detail::winapi::wait_failed)
110         ec = get_last_error();
111
112     else if (wait_code == ::boost::detail::winapi::wait_timeout)
113         return false; //
114
115     return true;
116 ;
117 }
118
119 }}}}
120
121 #endif /* BOOST_PROCESS_DETAIL_WINDOWS_WAIT_GROUP_HPP_ */