39 fCond.waiters_count_ = 0;
40 fCond.was_broadcast_ = 0;
41 fCond.sema_ = CreateSemaphore(0,
45 InitializeCriticalSection (&
fCond.waiters_count_lock_);
46 fCond.waiters_done_ = CreateEvent(0,
68 EnterCriticalSection(&
fCond.waiters_count_lock_);
69 fCond.waiters_count_++;
70 LeaveCriticalSection(&
fCond.waiters_count_lock_);
76 ::LeaveCriticalSection(&
fMutex->fCritSect);
77 WaitForSingleObject(
fCond.sema_, INFINITE);
80 EnterCriticalSection(&
fCond.waiters_count_lock_);
83 fCond.waiters_count_--;
86 int last_waiter =
fCond.was_broadcast_ &&
fCond.waiters_count_ == 0;
88 LeaveCriticalSection(&
fCond.waiters_count_lock_);
96 SetEvent(
fCond.waiters_done_);
97 ::EnterCriticalSection(&
fMutex->fCritSect);
103 ::EnterCriticalSection(&
fMutex->fCritSect);
121 DWORD dwMillisecondsNow = (DWORD)((secNow * 1000) + (nanosecNow / 1000000));
122 DWORD dwMilliseconds = (DWORD)((secs * 1000) + (nanoSecs / 1000000));
124 DWORD dwTimeWait = (DWORD)(dwMilliseconds - dwMillisecondsNow);
126 EnterCriticalSection(&
fCond.waiters_count_lock_);
127 fCond.waiters_count_++;
128 LeaveCriticalSection(&
fCond.waiters_count_lock_);
134 ::LeaveCriticalSection(&
fMutex->fCritSect);
135 ret = WaitForSingleObject(
fCond.sema_, dwTimeWait);
138 EnterCriticalSection(&
fCond.waiters_count_lock_);
141 fCond.waiters_count_--;
144 int last_waiter =
fCond.was_broadcast_ &&
fCond.waiters_count_ == 0;
146 LeaveCriticalSection(&
fCond.waiters_count_lock_);
154 SetEvent(
fCond.waiters_done_);
155 ::EnterCriticalSection(&
fMutex->fCritSect);
161 ::EnterCriticalSection(&
fMutex->fCritSect);
163 if (
ret == WAIT_TIMEOUT)
174 EnterCriticalSection (&
fCond.waiters_count_lock_);
175 int have_waiters =
fCond.waiters_count_ > 0;
176 LeaveCriticalSection (&
fCond.waiters_count_lock_);
180 ReleaseSemaphore(
fCond.sema_, 1, 0);
193 EnterCriticalSection(&
fCond.waiters_count_lock_);
194 int have_waiters = 0;
196 if (
fCond.waiters_count_ > 0) {
200 fCond.was_broadcast_ = 1;
206 ReleaseSemaphore(
fCond.sema_,
fCond.waiters_count_, 0);
208 LeaveCriticalSection(&
fCond.waiters_count_lock_);
212 WaitForSingleObject(
fCond.waiters_done_, INFINITE);
215 fCond.was_broadcast_ = 0;
218 LeaveCriticalSection(&
fCond.waiters_count_lock_);
int Int_t
Signed integer 4 bytes (int).
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
The TTimeStamp encapsulates seconds and ns since EPOCH.
Int_t TimedWait(ULong_t secs, ULong_t nanoSecs=0) override
TimedWait() is given an absolute time to wait until.
Int_t Signal() override
If one or more threads have called Wait(), Signal() wakes up at least one of them,...
virtual ~TWin32Condition()
TCondition dtor.
TWin32Condition(TMutexImp *m)
Create Condition variable.
Int_t Broadcast() override
Broadcast is like signal but wakes all threads which have called Wait().
Int_t Wait() override
Wait for the condition variable to be signalled.