xtd 0.2.0
wait_handle.h
Go to the documentation of this file.
1 #pragma once
5 #include "timeout.h"
6 #include "../abstract.h"
7 #include "../as.h"
8 #include "../time_span.h"
9 #include "../types.h"
10 #include <limits>
11 #include <vector>
12 
14 namespace xtd {
16  namespace threading {
18  class registered_wait_handle;
19  class thread;
21 
48  class core_export_ wait_handle abstract_ {
49  friend class registered_wait_handle;
50  friend class thread;
51  public:
53 
59  static const intptr invalid_handle;
60 
63  static constexpr size_t wait_timeout = std::numeric_limits<size_t>::max();
64 
66 
69  wait_handle() = default;
71 
73  ~wait_handle();
75 
77 
81  virtual intptr handle() const noexcept = 0;
84  virtual void handle(intptr value) = 0;
86 
88 
92  virtual void close();
93 
101  static bool signal_and_wait(wait_handle& to_signal, wait_handle& to_wait);
102 
111  static bool signal_and_wait(wait_handle& to_signal, wait_handle& to_wait, int32 milliseconds_timeout);
112 
121  static bool signal_and_wait(wait_handle& to_signal, wait_handle& to_wait, const time_span& timeout);
122 
129  template<typename collection_t>
130  static bool wait_all(const collection_t& wait_handles) {return wait_all(wait_handles, timeout::infinite);}
131 
140  template<typename collection_t>
141  static bool wait_all(const collection_t& wait_handles, int32 milliseconds_timeout) {
142  std::vector<wait_handle*> wait_handle_pointers;
143  for (auto& item : wait_handles)
144  wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
145  return wait_all(wait_handle_pointers, milliseconds_timeout);
146  }
147 
156  template<typename collection_t>
157  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()));}
158 
166  template<typename collection_t>
167  static size_t wait_any(const collection_t& wait_handles) {return wait_any(wait_handles, timeout::infinite);}
168 
177  template<typename collection_t>
178  static size_t wait_any(const collection_t& wait_handles, int32 milliseconds_timeout) {
179  std::vector<wait_handle*> wait_handle_pointers;
180  for (auto& item : wait_handles)
181  wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
182  return wait_any(wait_handle_pointers, milliseconds_timeout);
183  }
184 
193  template<typename collection_t>
194  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()));}
195 
200  virtual bool wait_one();
201 
208  virtual bool wait_one(int32 milliseconds_timeout);
209 
216  virtual bool wait_one(const time_span& timeout);
218 
220  template <typename... items_t>
221  static size_t wait_all(items_t... items) {return wait_all(timeout::infinite, items...);}
222  template <typename... items_t>
223  static size_t wait_all(const time_span& timeout, items_t... items) {return wait_all(as<int32>(timeout.total_milliseconds()), items...);}
224  template <typename... items_t>
225  static size_t wait_all(int32 milliseconds_timeout, items_t... items) {
226  std::vector<wait_handle*> wait_handle_pointers;
227  fill_wait_handle_pointers(wait_handle_pointers, items...);
228  return wait_all(wait_handle_pointers, milliseconds_timeout);
229  }
230  template<typename item_t>
231  static bool wait_all(const std::initializer_list<item_t>& wait_handles) {return wait_all(wait_handles, timeout::infinite);}
232  template<typename item_t>
233  static bool wait_all(const std::initializer_list<item_t>& wait_handles, int32 milliseconds_timeout) {
234  std::vector<wait_handle*> wait_handle_pointers;
235  for (auto& item : wait_handles)
236  wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
237  return wait_all(wait_handle_pointers, milliseconds_timeout);
238  }
239  template<typename item_t>
240  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()));}
241  static bool wait_all(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles);
242  static bool wait_all(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
243  static bool wait_all(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles, const time_span& timeout);
244  static bool wait_all(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles);
245  static bool wait_all(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
246  static bool wait_all(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles, const time_span& timeout);
247  static bool wait_all(const std::vector<std::shared_ptr<wait_handle>>& wait_handles);
248  static bool wait_all(const std::vector<std::shared_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
249  static bool wait_all(const std::vector<std::shared_ptr<wait_handle>>& wait_handles, const time_span& timeout);
250  static bool wait_all(const std::vector<std::unique_ptr<wait_handle>>& wait_handles);
251  static bool wait_all(const std::vector<std::unique_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
252  static bool wait_all(const std::vector<std::unique_ptr<wait_handle>>& wait_handles, const time_span& timeout);
253  static bool wait_all(const std::vector<wait_handle*>& wait_handles, int32 milliseconds_timeout);
254 
255  template <typename... items_t>
256  static size_t wait_any(items_t... items) {return wait_any(timeout::infinite, items...);}
257  template <typename... items_t>
258  static size_t wait_any(const time_span& timeout, items_t... items) {return wait_any(as<int32>(timeout.total_milliseconds()), items...);}
259  template <typename... items_t>
260  static size_t wait_any(int32 milliseconds_timeout, items_t... items) {
261  std::vector<wait_handle*> wait_handle_pointers;
262  fill_wait_handle_pointers(wait_handle_pointers, items...);
263  return wait_any(wait_handle_pointers, milliseconds_timeout);
264  }
265  template<typename item_t>
266  static size_t wait_any(const std::initializer_list<item_t>& wait_handles) {return wait_any(wait_handles, timeout::infinite);}
267  template<typename item_t>
268  static size_t wait_any(const std::initializer_list<item_t>& wait_handles, int32 milliseconds_timeout) {
269  std::vector<wait_handle*> wait_handle_pointers;
270  for (auto& item : wait_handles)
271  wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
272  return wait_any(wait_handle_pointers, milliseconds_timeout);
273  }
274  template<typename item_t>
275  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()));}
276  static size_t wait_any(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles);
277  static size_t wait_any(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
278  static size_t wait_any(const std::initializer_list<std::shared_ptr<wait_handle>>& wait_handles, const time_span& timeout);
279  static size_t wait_any(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles);
280  static size_t wait_any(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
281  static size_t wait_any(const std::initializer_list<std::unique_ptr<wait_handle>>& wait_handles, const time_span& timeout);
282  static size_t wait_any(const std::vector<std::shared_ptr<wait_handle>>& wait_handles);
283  static size_t wait_any(const std::vector<std::shared_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
284  static size_t wait_any(const std::vector<std::shared_ptr<wait_handle>>& wait_handles, const time_span& timeout);
285  static size_t wait_any(const std::vector<std::unique_ptr<wait_handle>>& wait_handles);
286  static size_t wait_any(const std::vector<std::unique_ptr<wait_handle>>& wait_handles, int32 milliseconds_timeout);
287  static size_t wait_any(const std::vector<std::unique_ptr<wait_handle>>& wait_handles, const time_span& timeout);
288  static size_t wait_any(const std::vector<wait_handle*>& wait_handles, int32 milliseconds_timeout);
290 
291  protected:
293 
298  virtual bool signal() = 0;
299 
306  virtual bool wait(int32 milliseconds_timeout) = 0;
308 
309  private:
310  template <typename item_t, typename... items_t>
311  static void fill_wait_handle_pointers(std::vector<wait_handle*>& wait_handle_pointers, item_t& first, items_t&... rest) {
312  wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&first)));
313  fill_wait_handle_pointers(wait_handle_pointers, rest...);
314  }
315  template <typename item_t>
316  static void fill_wait_handle_pointers(std::vector<wait_handle*>& wait_handle_pointers, item_t& item) {
317  wait_handle_pointers.push_back(const_cast<wait_handle*>(as<wait_handle>(&item)));
318  }
319  };
320  }
321 }
signal
Specifies signals that can interrupt the current process.
Definition: signal.h:18
intmax_t intptr
Represent a pointer or a handle.
Definition: types.h:151
int32 as< int32 >(std::any value)
Casts a type into another type.
Definition: as.h:9228
Contains xtd::threading::timeout class.
The xtd namespace contains all fundamental classes to access Hardware, Os, System, and more.
Definition: system_report.h:17
std::chrono::milliseconds total_milliseconds_duration() const noexcept
Gets the value of the current xtd::time_span structure expressed in whole and fractional milliseconds...
static constexpr int32 infinite
A constant used to specify an infinite waiting period. This field is constant.
Definition: timeout.h:39
double total_milliseconds() const noexcept
Gets the value of the current xtd::time_span structure expressed in whole and fractional milliseconds...
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:157
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:130
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
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:167
Represents a time interval.
Definition: time_span.h:26
int_least32_t int32
Represents a 32-bit signed integer.
Definition: types.h:129
Contains a constant used to specify an infinite amount of time. This class cannot be inherited...
Definition: timeout.h:31
#define abstract_
This keyword is used to represents an abstract class.
Definition: abstract.h:23
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:178
static const intptr invalid_handle
Represents an invalid native operating system handle. This field is read-only.
Definition: wait_handle.h:59
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:194
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:141
Encapsulates operating system specific objects that wait for exclusive access to shared resources...
Definition: wait_handle.h:48