xtd 0.2.0
Loading...
Searching...
No Matches
wait_handle.h
Go to the documentation of this file.
1
4#pragma once
5
6#include "timeout.h"
7#include "../abstract.h"
8#include "../as.h"
9#include "../size_object.h"
10#include "../time_span.h"
11#include "../types.h"
12#include <limits>
13#include <vector>
14
16namespace xtd {
18 namespace threading {
20 class registered_wait_handle;
21 class thread;
23
51 friend class registered_wait_handle;
52 friend class thread;
53 public:
55
61 static const intptr invalid_handle;
62
65 static constexpr size_t wait_timeout = size_object::max_value;
67
69
72 wait_handle() = default;
74
78
80
84 virtual intptr handle() const noexcept = 0;
87 virtual void handle(intptr value) = 0;
89
91
95 virtual void close();
96
101 virtual bool wait_one();
102
109 virtual bool wait_one(int32 milliseconds_timeout);
110
117 virtual bool wait_one(const time_span& timeout);
119
121
130 static bool signal_and_wait(wait_handle& to_signal, wait_handle& to_wait);
131
140 static bool signal_and_wait(wait_handle& to_signal, wait_handle& to_wait, int32 milliseconds_timeout);
141
150 static bool signal_and_wait(wait_handle& to_signal, wait_handle& to_wait, const time_span& timeout);
151
158 template<typename collection_t>
159 static bool wait_all(const collection_t& wait_handles) {return wait_all(wait_handles, timeout::infinite);}
160
169 template<typename collection_t>
170 static bool wait_all(const collection_t& wait_handles, int32 milliseconds_timeout) {
171 std::vector<wait_handle*> wait_handle_pointers;
172 for (auto& item : wait_handles)
173 wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
174 return wait_all(wait_handle_pointers, milliseconds_timeout);
175 }
176
185 template<typename collection_t>
186 static bool wait_all(const collection_t& wait_handles, const time_span& timeout) {return wait_all(wait_handles, as<int32>(timeout.total_milliseconds_duration().count()));}
187
195 template<typename collection_t>
196 static size_t wait_any(const collection_t& wait_handles) {return wait_any(wait_handles, timeout::infinite);}
197
206 template<typename collection_t>
207 static size_t wait_any(const collection_t& wait_handles, int32 milliseconds_timeout) {
208 std::vector<wait_handle*> wait_handle_pointers;
209 for (auto& item : wait_handles)
210 wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
211 return wait_any(wait_handle_pointers, milliseconds_timeout);
212 }
213
222 template<typename collection_t>
223 static size_t wait_any(const collection_t& wait_handles, const time_span& timeout) {return wait_any(wait_handles, as<int32>(timeout.total_milliseconds_duration().count()));}
225
227 template <typename... items_t>
228 static size_t wait_all(items_t... items) {return wait_all(timeout::infinite, items...);}
229 template <typename... items_t>
230 static size_t wait_all(const time_span& timeout, items_t... items) {return wait_all(as<int32>(timeout.total_milliseconds()), items...);}
231 template <typename... items_t>
232 static size_t wait_all(int32 milliseconds_timeout, items_t... items) {
233 std::vector<wait_handle*> wait_handle_pointers;
234 fill_wait_handle_pointers(wait_handle_pointers, items...);
235 return wait_all(wait_handle_pointers, milliseconds_timeout);
236 }
237 template<typename item_t>
238 static bool wait_all(const std::initializer_list<item_t>& wait_handles) {return wait_all(wait_handles, timeout::infinite);}
239 template<typename item_t>
240 static bool wait_all(const std::initializer_list<item_t>& wait_handles, int32 milliseconds_timeout) {
241 std::vector<wait_handle*> wait_handle_pointers;
242 for (auto& item : wait_handles)
243 wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
244 return wait_all(wait_handle_pointers, milliseconds_timeout);
245 }
246 template<typename item_t>
247 static bool wait_all(const std::initializer_list<item_t>& wait_handles, const time_span& timeout) {return wait_all(wait_handles, as<int32>(timeout.total_milliseconds_duration().count()));}
248 static bool wait_all(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles);
249 static bool wait_all(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
250 static bool wait_all(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles, const time_span& timeout);
251 static bool wait_all(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles);
252 static bool wait_all(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
253 static bool wait_all(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles, const time_span& timeout);
254 static bool wait_all(const std::vector<std::shared_ptr<wait_handle>>& wait_handles);
255 static bool wait_all(const std::vector<std::shared_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
256 static bool wait_all(const std::vector<std::shared_ptr<wait_handle>>& wait_handles, const time_span& timeout);
257 static bool wait_all(const std::vector<std::unique_ptr<wait_handle>>& wait_handles);
258 static bool wait_all(const std::vector<std::unique_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
259 static bool wait_all(const std::vector<std::unique_ptr<wait_handle>>& wait_handles, const time_span& timeout);
260 static bool wait_all(const std::vector<wait_handle*>& wait_handles, int32 milliseconds_timeout);
261
262 template <typename... items_t>
263 static size_t wait_any(items_t... items) {return wait_any(timeout::infinite, items...);}
264 template <typename... items_t>
265 static size_t wait_any(const time_span& timeout, items_t... items) {return wait_any(as<int32>(timeout.total_milliseconds()), items...);}
266 template <typename... items_t>
267 static size_t wait_any(int32 milliseconds_timeout, items_t... items) {
268 std::vector<wait_handle*> wait_handle_pointers;
269 fill_wait_handle_pointers(wait_handle_pointers, items...);
270 return wait_any(wait_handle_pointers, milliseconds_timeout);
271 }
272 template<typename item_t>
273 static size_t wait_any(const std::initializer_list<item_t>& wait_handles) {return wait_any(wait_handles, timeout::infinite);}
274 template<typename item_t>
275 static size_t wait_any(const std::initializer_list<item_t>& wait_handles, int32 milliseconds_timeout) {
276 std::vector<wait_handle*> wait_handle_pointers;
277 for (auto& item : wait_handles)
278 wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
279 return wait_any(wait_handle_pointers, milliseconds_timeout);
280 }
281 template<typename item_t>
282 static size_t wait_any(const std::initializer_list<item_t>& wait_handles, const time_span& timeout) {return wait_any(wait_handles, as<int32>(timeout.total_milliseconds_duration().count()));}
283 static size_t wait_any(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles);
284 static size_t wait_any(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
285 static size_t wait_any(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles, const time_span& timeout);
286 static size_t wait_any(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles);
287 static size_t wait_any(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
288 static size_t wait_any(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles, const time_span& timeout);
289 static size_t wait_any(const std::vector<std::shared_ptr<wait_handle>>& wait_handles);
290 static size_t wait_any(const std::vector<std::shared_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
291 static size_t wait_any(const std::vector<std::shared_ptr<wait_handle>>& wait_handles, const time_span& timeout);
292 static size_t wait_any(const std::vector<std::unique_ptr<wait_handle>>& wait_handles);
293 static size_t wait_any(const std::vector<std::unique_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
294 static size_t wait_any(const std::vector<std::unique_ptr<wait_handle>>& wait_handles, const time_span& timeout);
295 static size_t wait_any(const std::vector<wait_handle*>& wait_handles, int32 milliseconds_timeout);
297
298 protected:
300
305 virtual bool signal() = 0;
306
313 virtual bool wait(int32 milliseconds_timeout) = 0;
315
316 private:
317 template <typename item_t, typename... items_t>
318 static void fill_wait_handle_pointers(std::vector<wait_handle*>& wait_handle_pointers, item_t& first, items_t&... rest) {
319 wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&first)));
320 fill_wait_handle_pointers(wait_handle_pointers, rest...);
321 }
322 template <typename item_t>
323 static void fill_wait_handle_pointers(std::vector<wait_handle*>& wait_handle_pointers, item_t& item) {
324 wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
325 }
326 };
327 }
328}
A synchronization primitive that can also be used for interprocess synchronization.
Definition registered_wait_handle.h:27
Creates and controls a thread, sets its priority, and gets its status.
Definition thread.h:41
Contains a constant used to specify an infinite amount of time. This class cannot be inherited.
Definition timeout.h:31
Encapsulates operating system specific objects that wait for exclusive access to shared resources.
Definition wait_handle.h:50
static const intptr invalid_handle
Represents an invalid native operating system handle. This field is read-only.
Definition wait_handle.h:61
static bool wait_all(const collection_t &wait_handles)
Waits for all the elements in the specified collection to receive a signal.
Definition wait_handle.h:159
static size_t wait_any(const collection_t &wait_handles, int32 milliseconds_timeout)
Waits for any of the elements in the specified collection to receive a signal, using a 32-bit signed ...
Definition wait_handle.h:207
wait_handle()=default
Initializes a new instance of the xtd::threading::wait_handle class.
static bool wait_all(const collection_t &wait_handles, int32 milliseconds_timeout)
Waits for all the elements in the specified collection to receive a signal, using an int32 value to m...
Definition wait_handle.h:170
virtual bool wait(int32 milliseconds_timeout)=0
wait ownership of the specified mutex object.
virtual intptr handle() const noexcept=0
Gets the native operating system handle.
virtual bool signal()=0
Releases ownership of the specified wait_handle object.
static bool wait_all(const collection_t &wait_handles, const time_span &timeout)
Waits for all the elements in the specified collection to receive a signal, using a xtd::time_span va...
Definition wait_handle.h:186
static size_t wait_any(const collection_t &wait_handles)
Waits for any of the elements in the specified collection to receive a signal.
Definition wait_handle.h:196
static size_t wait_any(const collection_t &wait_handles, const time_span &timeout)
Waits for any of the elements in the specified collection to receive a signal, using a xtd::time_span...
Definition wait_handle.h:223
#define abstract_
This keyword is used to represents an abstract class.
Definition abstract.h:23
#define core_export_
Define shared library export.
Definition core_export.h:13
int_least32_t int32
Represents a 32-bit signed integer.
Definition types.h:131
intmax_t intptr
Represent a pointer or a handle.
Definition types.h:153
new_type_t as(std::any value)
Casts a type into another type.
Definition as.h:37
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition xtd_about_box.h:10
Represents a time interval.
Definition time_span.h:26
double total_milliseconds() const noexcept
Gets the value of the current xtd::time_span structure expressed in whole and fractional milliseconds...
Contains xtd::threading::timeout class.