summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Goffart <olivier.goffart@nokia.com>2011-02-02 08:27:53 (GMT)
committerOlivier Goffart <olivier.goffart@nokia.com>2011-02-02 08:50:39 (GMT)
commit9fa392cdb528db0bb5073892484c809e99ae27b3 (patch)
treed28d351611fdd15142829fc51be6a02b35d43759
parent95b17fbe91eb3b1b0fcac92d8a8934769e4cd847 (diff)
downloadQt-9fa392cdb528db0bb5073892484c809e99ae27b3.zip
Qt-9fa392cdb528db0bb5073892484c809e99ae27b3.tar.gz
Qt-9fa392cdb528db0bb5073892484c809e99ae27b3.tar.bz2
Revert "Restore Qt 4.6 behaviour: exec() always enters the event loop."
This reverts commit 2e72a8b19ea6c674fb4777860dac50faa5d387e6. The behavour in Qt 4.6 was wrong. And even if it was not documented, it is too late to change the behaviour back at this point. The tests for QEventLoop and QCoreApplication have not been reverted Reviewed-by: Brad
-rw-r--r--src/corelib/thread/qthread.cpp5
-rw-r--r--tests/auto/qthread/tst_qthread.cpp191
2 files changed, 58 insertions, 138 deletions
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index f4bfa5d..f368192 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -482,7 +482,10 @@ int QThread::exec()
Q_D(QThread);
QMutexLocker locker(&d->mutex);
d->data->quitNow = false;
- d->exited = false;
+ if (d->exited) {
+ d->exited = false;
+ return d->returnCode;
+ }
locker.unlock();
QEventLoop eventLoop;
diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp
index c7036e4..e6bf9ce 100644
--- a/tests/auto/qthread/tst_qthread.cpp
+++ b/tests/auto/qthread/tst_qthread.cpp
@@ -86,7 +86,6 @@ private slots:
void start();
void terminate();
void quit();
- void execAfterQuit();
void wait();
void started();
void finished();
@@ -266,34 +265,6 @@ public:
}
};
-class ExecAfterQuitThreadHelper: public QObject
-{
- Q_OBJECT
- QThread *thr;
-public:
- ExecAfterQuitThreadHelper(QThread *thr) : thr(thr) {}
-public slots:
- void doIt() { thr->exit(0); }
-};
-
-class ExecAfterQuitThread: public QThread
-{
-public:
- int returnValue;
- void run()
- {
- ExecAfterQuitThreadHelper obj(this);
-
- QMetaObject::invokeMethod(&obj, "doIt", Qt::QueuedConnection);
- exit(1);
-
- // returnValue will be either 0 or 1, depending on which of the two
- // above take effect. The correct value is 0, since exit(1) before
- // exec() should have no effect
- returnValue = exec();
- }
-};
-
tst_QThread::tst_QThread()
{
@@ -453,52 +424,34 @@ void tst_QThread::stackSize()
void tst_QThread::exit()
{
- {
- Exit_Thread thread;
- thread.object = new Exit_Object;
- thread.object->moveToThread(&thread);
- thread.code = 42;
- thread.result = 0;
- QVERIFY(!thread.isFinished());
- QVERIFY(!thread.isRunning());
-
- QMutexLocker locker(&thread.mutex);
- thread.start();
- QVERIFY(thread.isRunning());
- QVERIFY(!thread.isFinished());
- // but the thread is not running the event loop yet (the mutex is locked)
-
- // start the event loop
- thread.cond.wait(locker.mutex());
-
- // the Exit_Object above will cause the thread to exit
- QVERIFY(thread.wait(five_minutes));
- QVERIFY(thread.isFinished());
- QVERIFY(!thread.isRunning());
- QCOMPARE(thread.result, thread.code);
- delete thread.object;
- }
+ Exit_Thread thread;
+ thread.object = new Exit_Object;
+ thread.object->moveToThread(&thread);
+ thread.code = 42;
+ thread.result = 0;
+ QVERIFY(!thread.isFinished());
+ QVERIFY(!thread.isRunning());
+ QMutexLocker locker(&thread.mutex);
+ thread.start();
+ QVERIFY(thread.isRunning());
+ QVERIFY(!thread.isFinished());
+ thread.cond.wait(locker.mutex());
+ QVERIFY(thread.wait(five_minutes));
+ QVERIFY(thread.isFinished());
+ QVERIFY(!thread.isRunning());
+ QCOMPARE(thread.result, thread.code);
+ delete thread.object;
- {
- Exit_Thread thread2;
- thread2.object = 0;
- thread2.code = 53;
- thread2.result = 0;
- QMutexLocker locker2(&thread2.mutex);
- thread2.start();
-
- // the mutex is locked, so the thread has *not* started running the event loop yet
- // this will do nothing:
- thread2.exit(thread2.code);
-
- // the thread will now start running
- thread2.cond.wait(locker2.mutex());
-
- // this will cause it to exit now
- thread2.exit(++thread2.code);
- QVERIFY(thread2.wait(five_minutes));
- QCOMPARE(thread2.result, thread2.code);
- }
+ Exit_Thread thread2;
+ thread2.object = 0;
+ thread2.code = 53;
+ thread2.result = 0;
+ QMutexLocker locker2(&thread2.mutex);
+ thread2.start();
+ thread2.exit(thread2.code);
+ thread2.cond.wait(locker2.mutex());
+ QVERIFY(thread2.wait(five_minutes));
+ QCOMPARE(thread2.result, thread2.code);
}
void tst_QThread::start()
@@ -545,59 +498,32 @@ void tst_QThread::terminate()
void tst_QThread::quit()
{
- // very similar to exit() above
- {
- Quit_Thread thread;
- thread.object = new Quit_Object;
- thread.object->moveToThread(&thread);
- thread.result = -1;
- QVERIFY(!thread.isFinished());
- QVERIFY(!thread.isRunning());
-
- // start the thread, but keep the event loop from starting
- // (while the mutex is locked)
- QMutexLocker locker(&thread.mutex);
- thread.start();
- QVERIFY(thread.isRunning());
- QVERIFY(!thread.isFinished());
-
- // unlock the mutex and let the event loop run
- // the Quit_Object above will cause the thread to quit
- thread.cond.wait(locker.mutex());
- QVERIFY(thread.wait(five_minutes));
- QVERIFY(thread.isFinished());
- QVERIFY(!thread.isRunning());
- QCOMPARE(thread.result, 0);
- delete thread.object;
- }
-
- {
- Quit_Thread thread2;
- thread2.object = 0;
- thread2.result = -1;
-
- // start the thread, but keep the event loop from starting
- // (while the mutex is locked)
- QMutexLocker locker2(&thread2.mutex);
- thread2.start();
- thread2.quit(); // does nothing, the event loop is not running!
-
- // unlock the mutex and let the event loop run
- thread2.cond.wait(locker2.mutex());
-
- // there's no Quit_Object so it won't quit on its own
- thread2.quit();
- QVERIFY(thread2.wait(five_minutes));
- QCOMPARE(thread2.result, 0);
- }
-}
-
-void tst_QThread::execAfterQuit()
-{
- ExecAfterQuitThread thread;
+ Quit_Thread thread;
+ thread.object = new Quit_Object;
+ thread.object->moveToThread(&thread);
+ thread.result = -1;
+ QVERIFY(!thread.isFinished());
+ QVERIFY(!thread.isRunning());
+ QMutexLocker locker(&thread.mutex);
thread.start();
- QVERIFY(thread.wait());
- QCOMPARE(thread.returnValue, 0);
+ QVERIFY(thread.isRunning());
+ QVERIFY(!thread.isFinished());
+ thread.cond.wait(locker.mutex());
+ QVERIFY(thread.wait(five_minutes));
+ QVERIFY(thread.isFinished());
+ QVERIFY(!thread.isRunning());
+ QCOMPARE(thread.result, 0);
+ delete thread.object;
+
+ Quit_Thread thread2;
+ thread2.object = 0;
+ thread2.result = -1;
+ QMutexLocker locker2(&thread2.mutex);
+ thread2.start();
+ thread2.quit();
+ thread2.cond.wait(locker2.mutex());
+ QVERIFY(thread2.wait(five_minutes));
+ QCOMPARE(thread2.result, 0);
}
void tst_QThread::wait()
@@ -1068,17 +994,8 @@ void tst_QThread::QTBUG15378_exitAndExec()
Thread thread;
thread.value = 0;
thread.start();
- thread.exit(42); // will do nothing, this value should not appear
- thread.sem1.release(); //should enter the first loop
-
- Exit_Object *exit_object = new Exit_Object;
- exit_object->code = 556;
- exit_object->thread = &thread;
- QMetaObject::invokeMethod(exit_object, "slot", Qt::QueuedConnection);
- exit_object->deleteLater();
- exit_object->moveToThread(&thread); // should exit the first loop
- exit_object = 0;
-
+ thread.exit(556);
+ thread.sem1.release(); //should exit the first loop
thread.sem2.acquire();
int v = thread.value;
QCOMPARE(v, 556);