40 fCond.waiters_count_ = 0;
41 fCond.was_broadcast_ = 0;
42 fCond.sema_ = CreateSemaphore(0,
46 InitializeCriticalSection (&
fCond.waiters_count_lock_);
47 fCond.waiters_done_ = CreateEvent(0,
69 EnterCriticalSection(&
fCond.waiters_count_lock_);
70 fCond.waiters_count_++;
71 LeaveCriticalSection(&
fCond.waiters_count_lock_);
77 ::LeaveCriticalSection(&
fMutex->fCritSect);
78 WaitForSingleObject(
fCond.sema_, INFINITE);
81 EnterCriticalSection(&
fCond.waiters_count_lock_);
84 fCond.waiters_count_--;
87 int last_waiter =
fCond.was_broadcast_ &&
fCond.waiters_count_ == 0;
89 LeaveCriticalSection(&
fCond.waiters_count_lock_);
97 SetEvent(
fCond.waiters_done_);
98 ::EnterCriticalSection(&
fMutex->fCritSect);
104 ::EnterCriticalSection(&
fMutex->fCritSect);
122 DWORD dwMillisecondsNow = (DWORD)((secNow * 1000) + (nanosecNow / 1000000));
123 DWORD dwMilliseconds = (DWORD)((secs * 1000) + (nanoSecs / 1000000));
125 DWORD dwTimeWait = (DWORD)(dwMilliseconds - dwMillisecondsNow);
127 EnterCriticalSection(&
fCond.waiters_count_lock_);
128 fCond.waiters_count_++;
129 LeaveCriticalSection(&
fCond.waiters_count_lock_);
135 ::LeaveCriticalSection(&
fMutex->fCritSect);
136 ret = WaitForSingleObject(
fCond.sema_, dwTimeWait);
139 EnterCriticalSection(&
fCond.waiters_count_lock_);
142 fCond.waiters_count_--;
145 int last_waiter =
fCond.was_broadcast_ &&
fCond.waiters_count_ == 0;
147 LeaveCriticalSection(&
fCond.waiters_count_lock_);
155 SetEvent(
fCond.waiters_done_);
156 ::EnterCriticalSection(&
fMutex->fCritSect);
162 ::EnterCriticalSection(&
fMutex->fCritSect);
164 if (ret == WAIT_TIMEOUT)
175 EnterCriticalSection (&
fCond.waiters_count_lock_);
176 int have_waiters =
fCond.waiters_count_ > 0;
177 LeaveCriticalSection (&
fCond.waiters_count_lock_);
181 ReleaseSemaphore(
fCond.sema_, 1, 0);
194 EnterCriticalSection(&
fCond.waiters_count_lock_);
195 int have_waiters = 0;
197 if (
fCond.waiters_count_ > 0) {
201 fCond.was_broadcast_ = 1;
207 ReleaseSemaphore(
fCond.sema_,
fCond.waiters_count_, 0);
209 LeaveCriticalSection(&
fCond.waiters_count_lock_);
213 WaitForSingleObject(
fCond.waiters_done_, INFINITE);
216 fCond.was_broadcast_ = 0;
219 LeaveCriticalSection(&
fCond.waiters_count_lock_);
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.