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 QWaitConditionEvent *wce =
nullptr;
165 auto prep = [&] { wce = d->pre(); };
166 auto wait = [&] {
return d->wait(wce, deadline); };
167 bool returnValue = QReadWriteLockPrivate::waitConditionWait(readWriteLock, prep, wait);
169 d->post(wce, returnValue);
174void QWaitCondition::wakeOne()
177 QMutexLocker locker(&d->mtx);
178 for (QWaitConditionEvent *current : std::as_const(d->queue)) {
179 if (current->wokenUp)
181 SetEvent(current->event);
182 current->wokenUp =
true;
187void QWaitCondition::wakeAll()
190 QMutexLocker locker(&d->mtx);
191 for (QWaitConditionEvent *current : std::as_const(d->queue)) {
192 SetEvent(current->event);
193 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