summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qthread.cpp
diff options
context:
space:
mode:
authorBradley T. Hughes <bradley.hughes@nokia.com>2010-04-15 11:55:38 (GMT)
committerBradley T. Hughes <bradley.hughes@nokia.com>2010-04-16 05:50:59 (GMT)
commit13ca61fcfdc53a6a06ae6f409ae0d9e17919336c (patch)
tree03fd7ab1974c629dbbf5b663c826a5b7bd469650 /src/corelib/thread/qthread.cpp
parent2913a71672a6cbe3022e167cf9d318beb2f29ee3 (diff)
downloadQt-13ca61fcfdc53a6a06ae6f409ae0d9e17919336c.zip
Qt-13ca61fcfdc53a6a06ae6f409ae0d9e17919336c.tar.gz
Qt-13ca61fcfdc53a6a06ae6f409ae0d9e17919336c.tar.bz2
Fix tst_QEventLoop::exec() regression introduced by commit 816523117bc00cfeb17e347f7fe5f11278a5e871
The quitNow flag needs to be reset at the beginning of exec() to allow exec() to recurse and be run multiple times. This changes reverts commit 816523117bc00cfeb17e347f7fe5f11278a5e871 an introduces the QThreadPrivate::exited flag to fix the race between start() and exit(), and QThreadPrivate::returnCode to make sure exec() returns the code passed to exit(). Task-number: QTBUG-1184 Reviewed-by: olivier
Diffstat (limited to 'src/corelib/thread/qthread.cpp')
-rw-r--r--src/corelib/thread/qthread.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index cdcb65c..2c63dfc 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -173,7 +173,7 @@ void QAdoptedThread::run()
*/
QThreadPrivate::QThreadPrivate(QThreadData *d)
- : QObjectPrivate(), running(false), finished(false), terminated(false),
+ : QObjectPrivate(), running(false), finished(false), terminated(false), exited(false), returnCode(-1),
stackSize(0), priority(QThread::InheritPriority), data(d)
{
#if defined (Q_OS_UNIX)
@@ -480,11 +480,18 @@ uint QThread::stackSize() const
int QThread::exec()
{
Q_D(QThread);
+ QMutexLocker locker(&d->mutex);
+ d->data->quitNow = false;
+ if (d->exited)
+ return d->returnCode;
+ locker.unlock();
+
QEventLoop eventLoop;
int returnCode = eventLoop.exec();
- QMutexLocker locker(&d->mutex);
- d->data->quitNow = false;
+ locker.relock();
+ d->exited = false;
+ d->returnCode = -1;
return returnCode;
}
@@ -511,6 +518,8 @@ void QThread::exit(int returnCode)
{
Q_D(QThread);
QMutexLocker locker(&d->mutex);
+ d->exited = true;
+ d->returnCode = returnCode;
d->data->quitNow = true;
for (int i = 0; i < d->data->eventLoops.size(); ++i) {
QEventLoop *eventLoop = d->data->eventLoops.at(i);