10#if __has_include("defs.h")
14#include "safe_winsock.h"
40 virtual DWORD
wait (DWORD limit_msec);
43 virtual DWORD
wait (std::chrono::milliseconds limit);
48 virtual DWORD
wait_msg (DWORD limit_msec = INFINITE, DWORD mask = QS_ALLINPUT);
59 virtual const std::string&
name ()
const
67 virtual void name (
const std::string& nam);
73 std::atomic_int lives;
87 assert (hl && hl->handle_);
88 WaitForSingleObject (hl->handle_, INFINITE);
98 assert (hl && hl->handle_);
99 return WaitForSingleObject (hl->handle_, limit_msec);
109 assert (hl && hl->handle_);
110 auto limit_msec = limit.count ();
111 assert (0 < limit_msec && limit_msec < INFINITE);
112 return WaitForSingleObject (hl->handle_, (DWORD)limit_msec);
119 assert (hl && hl->handle_);
120 return WaitForSingleObjectEx (hl->handle_, limit_msec, TRUE);
138 return MsgWaitForMultipleObjects (1, &hl->handle_, FALSE, limit_msec, mask);
142inline syncbase::operator bool ()
154 return (WaitForSingleObject (hl->handle_, 0) == WAIT_OBJECT_0);
170DWORD
wait_all (
const T* objs,
int count, DWORD msec = INFINITE)
172 assert (count < MAXIMUM_WAIT_OBJECTS);
173 HANDLE harr[MAXIMUM_WAIT_OBJECTS];
174 for (
int i = 0; i < count; i++)
175 harr[i] = objs[i]->handle ();
177 DWORD result = WaitForMultipleObjects (count, harr,
true, msec);
193DWORD
wait_all (std::initializer_list<const T*> objs, DWORD msec = INFINITE)
195 assert (objs.size () < MAXIMUM_WAIT_OBJECTS);
196 HANDLE harr[MAXIMUM_WAIT_OBJECTS];
199 harr[i++] = p->handle ();
201 DWORD result = WaitForMultipleObjects ((DWORD)objs.size (), harr,
true, msec);
217DWORD
wait_all (std::initializer_list<const T*> objs, std::chrono::milliseconds limit)
219 assert (objs.size () < MAXIMUM_WAIT_OBJECTS);
220 HANDLE harr[MAXIMUM_WAIT_OBJECTS];
223 harr[i++] = p->handle ();
225 DWORD msec = (DWORD)limit.count ();
226 DWORD result = WaitForMultipleObjects ((DWORD)objs.size (), harr,
true, msec);
243DWORD
wait_any (
const T* objs,
int count, DWORD msec = INFINITE)
245 assert (count < MAXIMUM_WAIT_OBJECTS);
246 HANDLE harr[MAXIMUM_WAIT_OBJECTS];
247 for (
int i = 0; i < count; i++)
248 harr[i] = objs[i].handle ();
250 DWORD result = WaitForMultipleObjects (count, harr,
false, msec);
266DWORD
wait_any (std::initializer_list<const T*> objs, DWORD msec = INFINITE)
268 assert (objs.size () < MAXIMUM_WAIT_OBJECTS);
269 HANDLE harr[MAXIMUM_WAIT_OBJECTS];
272 harr[i++] = p->handle ();
274 DWORD result = WaitForMultipleObjects ((DWORD)objs.size (), harr,
false, msec);
290DWORD
wait_any (std::initializer_list<const T*> objs, std::chrono::milliseconds timeout)
292 assert (objs.size () < MAXIMUM_WAIT_OBJECTS);
293 HANDLE harr[MAXIMUM_WAIT_OBJECTS];
296 harr[i++] = p->handle ();
297 DWORD msec = (DWORD)timeout.count ();
298 DWORD result = WaitForMultipleObjects ((DWORD)objs.size (), harr,
false, msec);
317DWORD
wait_msg (
const T* objs,
int count,
bool all =
true, DWORD msec = INFINITE,
318 DWORD mask = QS_ALLINPUT)
320 assert (count < MAXIMUM_WAIT_OBJECTS);
321 HANDLE harr[MAXIMUM_WAIT_OBJECTS];
322 for (
int i = 0; i < count; i++)
323 harr[i] = objs[i]->handle ();
325 DWORD result = MsgWaitForMultipleObjects (count, harr, all, msec, mask);
343DWORD
wait_msg (std::initializer_list<const T*> objs,
bool all =
true, DWORD msec = INFINITE,
344 DWORD mask = QS_ALLINPUT)
346 assert (objs.size () < MAXIMUM_WAIT_OBJECTS);
347 HANDLE harr[MAXIMUM_WAIT_OBJECTS];
350 harr[i++] = p->handle ();
352 DWORD result = MsgWaitForMultipleObjects ((DWORD)objs.size (), harr, all, msec, mask);
HANDLE handle() const
Return OS handle of this object.
Definition syncbase.h:53
void set_handle(HANDLE h)
Change object's handle. Closes the previous one.
Definition syncbase.cpp:125
syncbase()
Default constructor.
Definition syncbase.cpp:37
virtual void wait()
Wait for object to become signaled.
Definition syncbase.h:85
syncbase & operator=(const syncbase &rhs)
Assignment operator.
Definition syncbase.cpp:81
virtual DWORD wait_alertable(DWORD limit_msec=INFINITE)
Definition syncbase.h:117
int operator==(const syncbase &rhs) const
Equality operator.
Definition syncbase.cpp:119
virtual const std::string & name() const
Return object's name.
Definition syncbase.h:59
virtual DWORD wait_msg(DWORD limit_msec=INFINITE, DWORD mask=QS_ALLINPUT)
Wait for object to become signaled or a message to be queued.
Definition syncbase.h:136
virtual ~syncbase()
Destructor.
Definition syncbase.cpp:69
virtual bool is_signaled()
Try to wait on the object.
Definition syncbase.h:152
DWORD wait_any(const T *objs, int count, DWORD msec=INFINITE)
Wait for multiple objects until any of them becomes signaled.
Definition syncbase.h:243
DWORD wait_all(const T *objs, int count, DWORD msec=INFINITE)
Wait for multiple objects until all become signaled.
Definition syncbase.h:170
DWORD wait_msg(const T *objs, int count, bool all=true, DWORD msec=INFINITE, DWORD mask=QS_ALLINPUT)
Wait for multiple objects or a message to be queued.
Definition syncbase.h:317