tests/auto/qthread/tst_qthread.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
--- a/tests/auto/qthread/tst_qthread.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/tests/auto/qthread/tst_qthread.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -168,16 +168,18 @@
 class Exit_Thread : public Simple_Thread
 {
 public:
+    Exit_Object *object;
     int code;
     int result;
 
     void run()
     {
         Simple_Thread::run();
-        Exit_Object o;
-        o.thread = this;
-        o.code = code;
-        QTimer::singleShot(100, &o, SLOT(slot()));
+        if (object) {
+            object->thread = this;
+            object->code = code;
+            QTimer::singleShot(100, object, SLOT(slot()));
+        }
         result = exec();
     }
 };
@@ -211,17 +213,16 @@
 class Quit_Thread : public Simple_Thread
 {
 public:
+    Quit_Object *object;
     int result;
 
     void run()
     {
-        {
-            QMutexLocker locker(&mutex);
-            cond.wakeOne();
+        Simple_Thread::run();
+        if (object) {
+            object->thread = this;
+            QTimer::singleShot(100, object, SLOT(slot()));
         }
-        Quit_Object o;
-        o.thread = this;
-        QTimer::singleShot(100, &o, SLOT(slot()));
         result = exec();
     }
 };
@@ -420,6 +421,8 @@
 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());
@@ -433,19 +436,31 @@
     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();
+    thread2.exit(thread2.code);
+    thread2.cond.wait(locker2.mutex());
+    QVERIFY(thread2.wait(five_minutes));
+    QCOMPARE(thread2.result, thread2.code);
 }
 
 void tst_QThread::start()
 {
     QThread::Priority priorities[] = {
-	QThread::IdlePriority,
-	QThread::LowestPriority,
-	QThread::LowPriority,
-	QThread::NormalPriority,
-	QThread::HighPriority,
-	QThread::HighestPriority,
-	QThread::TimeCriticalPriority,
-	QThread::InheritPriority
+        QThread::IdlePriority,
+        QThread::LowestPriority,
+        QThread::LowPriority,
+        QThread::NormalPriority,
+        QThread::HighPriority,
+        QThread::HighestPriority,
+        QThread::TimeCriticalPriority,
+        QThread::InheritPriority
     };
     const int prio_count = sizeof(priorities) / sizeof(QThread::Priority);
 
@@ -480,6 +495,9 @@
 void tst_QThread::quit()
 {
     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);
@@ -491,6 +509,17 @@
     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()
@@ -667,7 +696,7 @@
     const int state = pthread_create(&nativeThreadHandle, 0, NativeThreadWrapper::runUnix, this);
     Q_UNUSED(state);
 #elif defined(Q_OS_WINCE)
-	nativeThreadHandle = CreateThread(NULL, 0 , (LPTHREAD_START_ROUTINE)NativeThreadWrapper::runWin , this, 0, NULL);
+        nativeThreadHandle = CreateThread(NULL, 0 , (LPTHREAD_START_ROUTINE)NativeThreadWrapper::runWin , this, 0, NULL);
 #elif defined Q_OS_WIN
     unsigned thrdid = 0;
     nativeThreadHandle = (Qt::HANDLE) _beginthreadex(NULL, 0, NativeThreadWrapper::runWin, this, 0, &thrdid);