tests/auto/qsemaphore/tst_qsemaphore.cpp
changeset 33 3e2da88830cd
parent 18 2f34d5167611
--- a/tests/auto/qsemaphore/tst_qsemaphore.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/tests/auto/qsemaphore/tst_qsemaphore.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -63,6 +63,7 @@
     void tryAcquire();
     void tryAcquireWithTimeout_data();
     void tryAcquireWithTimeout();
+    void tryAcquireWithTimeoutStarvation();
     void release();
     void available();
     void producerConsumer();
@@ -232,8 +233,8 @@
 {
     QTest::addColumn<int>("timeout");
 
-    QTest::newRow("") << 1000;
-    QTest::newRow("") << 10000;
+    QTest::newRow("1s") << 1000;
+    QTest::newRow("10s") << 10000;
 }
 
 void tst_QSemaphore::tryAcquireWithTimeout()
@@ -316,6 +317,50 @@
     QCOMPARE(semaphore.available(), 0);
 }
 
+void tst_QSemaphore::tryAcquireWithTimeoutStarvation()
+{
+    class Thread : public QThread
+    {
+    public:
+        QSemaphore startup;
+        QSemaphore *semaphore;
+        int amountToConsume, timeout;
+
+        void run()
+        {
+            startup.release();
+            forever {
+                if (!semaphore->tryAcquire(amountToConsume, timeout))
+                    break;
+                semaphore->release(amountToConsume);
+            }
+        }
+    };
+
+    QSemaphore semaphore;
+    semaphore.release(1);
+
+    Thread consumer;
+    consumer.semaphore = &semaphore;
+    consumer.amountToConsume = 1;
+    consumer.timeout = 1000;
+
+    // start the thread and wait for it to start consuming
+    consumer.start();
+    consumer.startup.acquire();
+
+    // try to consume more than the thread we started is, and provide a longer
+    // timeout... we should timeout, not wait indefinitely
+    QVERIFY(!semaphore.tryAcquire(consumer.amountToConsume * 2, consumer.timeout * 2));
+
+    // the consumer should still be running
+    QVERIFY(consumer.isRunning() && !consumer.isFinished());
+
+    // acquire, and wait for smallConsumer to timeout
+    semaphore.acquire();
+    QVERIFY(consumer.wait());
+}
+
 void tst_QSemaphore::release()
 { DEPENDS_ON("acquire"); }