13#define Q_MUTEX_T void *
14#include <private/qmutex_p.h>
15#include <private/qreadwritelock_p.h>
16#include <qt_windows.h>
29 event = CreateEvent(NULL, TRUE, FALSE, NULL);
55 freeQueue.isEmpty() ?
new QWaitConditionEvent : freeQueue.takeFirst();
56 wce
->priority = GetThreadPriority(GetCurrentThread());
61 for (; index < queue.size(); ++index) {
66 queue.insert(index, wce);
76 const DWORD timeout = deadline.isForever()
78 : DWORD(std::min(deadline.remainingTime(), qint64(INFINITE - 1)));
80 switch (WaitForSingleObjectEx(wce->event, timeout, FALSE)) {
84 if (deadline.hasExpired())
99 ResetEvent(wce->event);
100 freeQueue.append(wce);
103 if (!ret && wce->wokenUp && !queue.isEmpty()) {
105 SetEvent(other->event);
116QWaitCondition::QWaitCondition()
118 d =
new QWaitConditionPrivate;
121QWaitCondition::~QWaitCondition()
123 if (!d->queue.isEmpty()) {
124 qWarning(
"QWaitCondition: Destroyed while threads are still waiting");
125 qDeleteAll(d->queue);
128 qDeleteAll(d->freeQueue);
132bool QWaitCondition::wait(QMutex *mutex,
unsigned long time)
134 if (time == std::numeric_limits<
unsigned long>::max())
135 return wait(mutex, QDeadlineTimer(QDeadlineTimer::Forever));
136 return wait(mutex, QDeadlineTimer(time));
139bool QWaitCondition::wait(QMutex *mutex, QDeadlineTimer deadline)
144 QWaitConditionEvent *wce = d->pre();
147 bool returnValue = d->wait(wce, deadline);
150 d->post(wce, returnValue);
155bool QWaitCondition::wait(QReadWriteLock *readWriteLock,
unsigned long time)
157 if (time == std::numeric_limits<
unsigned long>::max())
158 return wait(readWriteLock, QDeadlineTimer(QDeadlineTimer::Forever));
159 return wait(readWriteLock, QDeadlineTimer(time));
162bool QWaitCondition::wait(QReadWriteLock *readWriteLock, QDeadlineTimer deadline)
164 using namespace QReadWriteLockStates;
168 auto previousState = QReadWriteLockPrivate::stateForWaitCondition(readWriteLock);
169 if (previousState == Unlocked)
171 if (previousState == RecursivelyLocked) {
172 qWarning(
"QWaitCondition: cannot wait on QReadWriteLocks with recursive lockForWrite()");
176 QWaitConditionEvent *wce = d->pre();
177 readWriteLock->unlock();
179 bool returnValue = d->wait(wce, deadline);
181 if (previousState == LockedForWrite)
182 readWriteLock->lockForWrite();
184 readWriteLock->lockForRead();
185 d->post(wce, returnValue);
190void QWaitCondition::wakeOne()
193 QMutexLocker locker(&d->mtx);
194 for (QWaitConditionEvent *current : std::as_const(d->queue)) {
195 if (current->wokenUp)
197 SetEvent(current->event);
198 current->wokenUp =
true;
203void QWaitCondition::wakeAll()
206 QMutexLocker locker(&d->mtx);
207 for (QWaitConditionEvent *current : std::as_const(d->queue)) {
208 SetEvent(current->event);
209 current->wokenUp =
true;
bool wait(QWaitConditionEvent *wce, QDeadlineTimer deadline)
QWaitConditionEvent * pre()
void post(QWaitConditionEvent *wce, bool ret)
QList< QWaitConditionEvent * > EventQueue