summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/thread/qthread/tst_qthread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/thread/qthread/tst_qthread.cpp')
-rw-r--r--tests/auto/corelib/thread/qthread/tst_qthread.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/auto/corelib/thread/qthread/tst_qthread.cpp b/tests/auto/corelib/thread/qthread/tst_qthread.cpp
index 25e1a0587c..8eccd17376 100644
--- a/tests/auto/corelib/thread/qthread/tst_qthread.cpp
+++ b/tests/auto/corelib/thread/qthread/tst_qthread.cpp
@@ -107,6 +107,8 @@ private slots:
void customEventDispatcher();
void stressTest();
+
+ void quitLock();
};
enum { one_minute = 60 * 1000, five_minutes = 5 * one_minute };
@@ -1285,5 +1287,52 @@ void tst_QThread::customEventDispatcher()
QVERIFY(weak_ed.isNull());
}
+class Job : public QObject
+{
+ Q_OBJECT
+public:
+ Job(QThread *thread, int deleteDelay, QObject *parent = 0)
+ : QObject(parent), quitLocker(thread), exitThreadCalled(false)
+ {
+ moveToThread(thread);
+ QTimer::singleShot(deleteDelay, this, SLOT(deleteLater()));
+ QTimer::singleShot(1000, this, SLOT(exitThread()));
+ }
+
+private slots:
+ void exitThread()
+ {
+ exitThreadCalled = true;
+ thread()->exit(1);
+ }
+
+private:
+ QEventLoopLocker quitLocker;
+public:
+ bool exitThreadCalled;
+};
+
+void tst_QThread::quitLock()
+{
+ QThread thread;
+
+ QEventLoop loop;
+ connect(&thread, SIGNAL(finished()), &loop, SLOT(quit()));
+
+ Job *job;
+
+ thread.start();
+ job = new Job(&thread, 500);
+ QCOMPARE(job->thread(), &thread);
+ loop.exec();
+ QVERIFY(!job->exitThreadCalled);
+
+ thread.start();
+ job = new Job(&thread, 2500);
+ QCOMPARE(job->thread(), &thread);
+ loop.exec();
+ QVERIFY(job->exitThreadCalled);
+}
+
QTEST_MAIN(tst_QThread)
#include "tst_qthread.moc"