diff options
Diffstat (limited to 'src/corelib/io/qwinoverlappedionotifier.cpp')
-rw-r--r-- | src/corelib/io/qwinoverlappedionotifier.cpp | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/src/corelib/io/qwinoverlappedionotifier.cpp b/src/corelib/io/qwinoverlappedionotifier.cpp index 33583afb78..06746c0597 100644 --- a/src/corelib/io/qwinoverlappedionotifier.cpp +++ b/src/corelib/io/qwinoverlappedionotifier.cpp @@ -41,6 +41,7 @@ #include "qwinoverlappedionotifier_p.h" #include <qdebug.h> +#include <qelapsedtimer.h> #include <qmutex.h> #include <qpointer.h> #include <qqueue.h> @@ -293,35 +294,58 @@ void QWinOverlappedIoNotifier::setEnabled(bool enabled) } /*! - * Wait synchronously for the notified signal. + * Wait synchronously for any notified signal. * - * The function returns true if the notified signal was emitted for - * the I/O operation that corresponds to the OVERLAPPED object. + * The function returns a pointer to the OVERLAPPED object corresponding to the completed I/O + * operation. In case no I/O operation was completed during the \a msec timeout, this function + * returns a null pointer. */ -bool QWinOverlappedIoNotifier::waitForNotified(int msecs, OVERLAPPED *overlapped) +OVERLAPPED *QWinOverlappedIoNotifier::waitForAnyNotified(int msecs) { Q_D(QWinOverlappedIoNotifier); if (!d->iocp->isRunning()) { - qWarning("Called QWinOverlappedIoNotifier::waitForNotified on inactive notifier."); - return false; + qWarning("Called QWinOverlappedIoNotifier::waitForAnyNotified on inactive notifier."); + return 0; } + if (msecs == 0) + d->iocp->drainQueue(); + + switch (WaitForSingleObject(d->hSemaphore, msecs == -1 ? INFINITE : DWORD(msecs))) { + case WAIT_OBJECT_0: + ReleaseSemaphore(d->hSemaphore, 1, NULL); + return d->_q_notified(); + case WAIT_TIMEOUT: + return 0; + default: + qErrnoWarning("QWinOverlappedIoNotifier::waitForAnyNotified: WaitForSingleObject failed."); + return 0; + } +} + +/*! + * Wait synchronously for the notified signal. + * + * The function returns true if the notified signal was emitted for + * the I/O operation that corresponds to the OVERLAPPED object. + */ +bool QWinOverlappedIoNotifier::waitForNotified(int msecs, OVERLAPPED *overlapped) +{ + int t = msecs; + QElapsedTimer stopWatch; + stopWatch.start(); forever { - if (msecs == 0) - d->iocp->drainQueue(); - DWORD result = WaitForSingleObject(d->hSemaphore, msecs == -1 ? INFINITE : DWORD(msecs)); - if (result == WAIT_OBJECT_0) { - ReleaseSemaphore(d->hSemaphore, 1, NULL); - if (d->_q_notified() == overlapped) - return true; - continue; - } else if (result == WAIT_TIMEOUT) { + OVERLAPPED *triggeredOverlapped = waitForAnyNotified(t); + if (!triggeredOverlapped) return false; + if (triggeredOverlapped == overlapped) + return true; + if (msecs != -1) { + t = msecs - stopWatch.elapsed(); + if (t < 0) + return false; } } - - qErrnoWarning("QWinOverlappedIoNotifier::waitForNotified: WaitForSingleObject failed."); - return false; } /*! |