diff options
author | David Faure <david.faure@kdab.com> | 2013-03-18 15:19:44 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-22 16:44:51 +0100 |
commit | f4609b202208fe592d24c7ae3b4a48ee83045497 (patch) | |
tree | c9827efe74688595664c379085ba2a6267e49c13 /src/corelib/kernel/qeventloop.cpp | |
parent | 85b25fc22176b574865813fa53f7eb2fcbdc89bf (diff) | |
download | qtbase-f4609b202208fe592d24c7ae3b4a48ee83045497.tar.gz |
QThread: fix race when setting the eventDispatcher
Use QAtomicPointer to make this thread-safe.
Change-Id: If71f204699fcefabdb59bd26342d777d1cc9e2a7
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/kernel/qeventloop.cpp')
-rw-r--r-- | src/corelib/kernel/qeventloop.cpp | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp index fe254b5593..549b8db9ca 100644 --- a/src/corelib/kernel/qeventloop.cpp +++ b/src/corelib/kernel/qeventloop.cpp @@ -103,7 +103,7 @@ QEventLoop::QEventLoop(QObject *parent) Q_D(QEventLoop); if (!QCoreApplication::instance()) { qWarning("QEventLoop: Cannot be used without QApplication"); - } else if (!d->threadData->eventDispatcher) { + } else if (!d->threadData->eventDispatcher.load()) { QThreadPrivate::createEventDispatcher(d->threadData); } } @@ -131,9 +131,9 @@ QEventLoop::~QEventLoop() bool QEventLoop::processEvents(ProcessEventsFlags flags) { Q_D(QEventLoop); - if (!d->threadData->eventDispatcher) + if (!d->threadData->eventDispatcher.load()) return false; - return d->threadData->eventDispatcher->processEvents(flags); + return d->threadData->eventDispatcher.load()->processEvents(flags); } /*! @@ -234,7 +234,7 @@ int QEventLoop::exec(ProcessEventsFlags flags) void QEventLoop::processEvents(ProcessEventsFlags flags, int maxTime) { Q_D(QEventLoop); - if (!d->threadData->eventDispatcher) + if (!d->threadData->eventDispatcher.load()) return; QElapsedTimer start; @@ -263,12 +263,12 @@ void QEventLoop::processEvents(ProcessEventsFlags flags, int maxTime) void QEventLoop::exit(int returnCode) { Q_D(QEventLoop); - if (!d->threadData->eventDispatcher) + if (!d->threadData->eventDispatcher.load()) return; d->returnCode = returnCode; d->exit = true; - d->threadData->eventDispatcher->interrupt(); + d->threadData->eventDispatcher.load()->interrupt(); } /*! @@ -292,9 +292,9 @@ bool QEventLoop::isRunning() const void QEventLoop::wakeUp() { Q_D(QEventLoop); - if (!d->threadData->eventDispatcher) + if (!d->threadData->eventDispatcher.load()) return; - d->threadData->eventDispatcher->wakeUp(); + d->threadData->eventDispatcher.load()->wakeUp(); } |