From f4609b202208fe592d24c7ae3b4a48ee83045497 Mon Sep 17 00:00:00 2001 From: David Faure Date: Mon, 18 Mar 2013 15:19:44 +0100 Subject: QThread: fix race when setting the eventDispatcher Use QAtomicPointer to make this thread-safe. Change-Id: If71f204699fcefabdb59bd26342d777d1cc9e2a7 Reviewed-by: Olivier Goffart --- src/corelib/kernel/qeventloop.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/corelib/kernel/qeventloop.cpp') diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp index fe254b55939..549b8db9ca9 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(); } -- cgit v1.2.3