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