12#define Q_MUTEX_T void *
13#include <private/qmutex_p.h>
14#include <private/qreadwritelock_p.h>
15#include <qt_windows.h>
28 event = CreateEvent(NULL, TRUE, FALSE, NULL);
54 freeQueue.isEmpty() ?
new QWaitConditionEvent : freeQueue.takeFirst();
55 wce
->priority = GetThreadPriority(GetCurrentThread());
60 for (; index < queue.size(); ++index) {
65 queue.insert(index, wce);
75 const DWORD timeout = deadline.isForever()
77 : DWORD(std::min(deadline.remainingTime(), qint64(INFINITE - 1)));
79 switch (WaitForSingleObjectEx(wce->event, timeout, FALSE)) {
83 if (deadline.hasExpired())
98 ResetEvent(wce->event);
99 freeQueue.append(wce);
102 if (!ret && wce->wokenUp && !queue.isEmpty()) {
104 SetEvent(other->event);
115QWaitCondition::QWaitCondition()
117 d =
new QWaitConditionPrivate;
120QWaitCondition::~QWaitCondition()
122 if (!d->queue.isEmpty()) {
123 qWarning(
"QWaitCondition: Destroyed while threads are still waiting");
124 qDeleteAll(d->queue);
127 qDeleteAll(d->freeQueue);
131bool QWaitCondition::wait(QMutex *mutex,
unsigned long time)
133 if (time == std::numeric_limits<
unsigned long>::max())
134 return wait(mutex, QDeadlineTimer(QDeadlineTimer::Forever));
135 return wait(mutex, QDeadlineTimer(time));
138bool QWaitCondition::wait(QMutex *mutex, QDeadlineTimer deadline)
143 QWaitConditionEvent *wce = d->pre();
146 bool returnValue = d->wait(wce, deadline);
149 d->post(wce, returnValue);
154bool QWaitCondition::wait(QReadWriteLock *readWriteLock,
unsigned long time)
156 if (time == std::numeric_limits<
unsigned long>::max())
157 return wait(readWriteLock, QDeadlineTimer(QDeadlineTimer::Forever));
158 return wait(readWriteLock, QDeadlineTimer(time));
161bool QWaitCondition::wait(QReadWriteLock *readWriteLock, QDeadlineTimer deadline)
163 using namespace QReadWriteLockStates;
167 auto previousState = QReadWriteLockPrivate::stateForWaitCondition(readWriteLock);
168 if (previousState == Unlocked)
170 if (previousState == RecursivelyLocked) {
171 qWarning(
"QWaitCondition: cannot wait on QReadWriteLocks with recursive lockForWrite()");
175 QWaitConditionEvent *wce = d->pre();
176 readWriteLock->unlock();
178 bool returnValue = d->wait(wce, deadline);
180 if (previousState == LockedForWrite)
181 readWriteLock->lockForWrite();
183 readWriteLock->lockForRead();
184 d->post(wce, returnValue);
189void QWaitCondition::wakeOne()
192 QMutexLocker locker(&d->mtx);
193 for (QWaitConditionEvent *current : std::as_const(d->queue)) {
194 if (current->wokenUp)
196 SetEvent(current->event);
197 current->wokenUp =
true;
202void QWaitCondition::wakeAll()
205 QMutexLocker locker(&d->mtx);
206 for (QWaitConditionEvent *current : std::as_const(d->queue)) {
207 SetEvent(current->event);
208 current->wokenUp =
true;
bool wait(QWaitConditionEvent *wce, QDeadlineTimer deadline)
QWaitConditionEvent * pre()
void post(QWaitConditionEvent *wce, bool ret)
Combined button and popup list for selecting options.
QList< QWaitConditionEvent * > EventQueue