summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qeventloop.cpp
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2013-03-15 19:38:21 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-03-29 04:04:40 +0100
commit5a5a09289fdc326be2e185e4d63dc243ce466e6c (patch)
tree2053c33a80400c118f9ddf573debef8aac1944dd /src/corelib/kernel/qeventloop.cpp
parent2f531d8db3aa9e7a1bbb9b674b43b9a71a3e4525 (diff)
QEventLoop: fix race on 'exit' and 'returnCode' private members
Change-Id: I380046f386448783e3e4e93bde8cbe15b9b0279e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qeventloop.cpp')
-rw-r--r--src/corelib/kernel/qeventloop.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp
index 549b8db9ca..3cb6890821 100644
--- a/src/corelib/kernel/qeventloop.cpp
+++ b/src/corelib/kernel/qeventloop.cpp
@@ -180,7 +180,7 @@ int QEventLoop::exec(ProcessEventsFlags flags)
LoopReference(QEventLoopPrivate *d, QMutexLocker &locker) : d(d), locker(locker), exceptionCaught(true)
{
d->inExec = true;
- d->exit = false;
+ d->exit.storeRelease(false);
++d->threadData->loopLevel;
d->threadData->eventLoops.push(d->q_func());
locker.unlock();
@@ -208,11 +208,11 @@ int QEventLoop::exec(ProcessEventsFlags flags)
if (app && app->thread() == thread())
QCoreApplication::removePostedEvents(app, QEvent::Quit);
- while (!d->exit)
+ while (!d->exit.loadAcquire())
processEvents(flags | WaitForMoreEvents | EventLoopExec);
ref.exceptionCaught = false;
- return d->returnCode;
+ return d->returnCode.load();
}
/*!
@@ -266,8 +266,8 @@ void QEventLoop::exit(int returnCode)
if (!d->threadData->eventDispatcher.load())
return;
- d->returnCode = returnCode;
- d->exit = true;
+ d->returnCode.store(returnCode);
+ d->exit.storeRelease(true);
d->threadData->eventDispatcher.load()->interrupt();
}
@@ -281,7 +281,7 @@ void QEventLoop::exit(int returnCode)
bool QEventLoop::isRunning() const
{
Q_D(const QEventLoop);
- return !d->exit;
+ return !d->exit.loadAcquire();
}
/*!