summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-11-23 09:47:49 +0100
committerLiang Qi <liang.qi@qt.io>2017-11-23 09:47:49 +0100
commit19378fa00884230fc9539e8cb881d4f75e67a83f (patch)
treee1e2f2946d6130368fbe8c9572ef6530638c1972 /tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp
parenteade2255ea7cd8200569080e9b295479b1f51bed (diff)
parent4d8ae444c2b15ec7da5ef133aa5ad5a548180e21 (diff)
Merge remote-tracking branch 'origin/5.9.3' into 5.9
Diffstat (limited to 'tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp')
-rw-r--r--tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp b/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp
index 2970b2e118..ce093f769c 100644
--- a/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp
+++ b/tests/auto/corelib/thread/qsemaphore/tst_qsemaphore.cpp
@@ -41,6 +41,8 @@ private slots:
void tryAcquireWithTimeout_data();
void tryAcquireWithTimeout();
void tryAcquireWithTimeoutStarvation();
+ void tryAcquireWithTimeoutForever_data();
+ void tryAcquireWithTimeoutForever();
void producerConsumer();
};
@@ -155,21 +157,25 @@ void tst_QSemaphore::tryAcquire()
semaphore.release();
QCOMPARE(semaphore.available(), 1);
QVERIFY(!semaphore.tryAcquire(2));
+ QVERIFY(!semaphore.tryAcquire(2, 0));
QCOMPARE(semaphore.available(), 1);
semaphore.release();
QCOMPARE(semaphore.available(), 2);
QVERIFY(!semaphore.tryAcquire(3));
+ QVERIFY(!semaphore.tryAcquire(3, 0));
QCOMPARE(semaphore.available(), 2);
semaphore.release(10);
QCOMPARE(semaphore.available(), 12);
QVERIFY(!semaphore.tryAcquire(100));
+ QVERIFY(!semaphore.tryAcquire(100, 0));
QCOMPARE(semaphore.available(), 12);
semaphore.release(10);
QCOMPARE(semaphore.available(), 22);
QVERIFY(!semaphore.tryAcquire(100));
+ QVERIFY(!semaphore.tryAcquire(100, 0));
QCOMPARE(semaphore.available(), 22);
QVERIFY(semaphore.tryAcquire());
@@ -178,23 +184,38 @@ void tst_QSemaphore::tryAcquire()
QVERIFY(semaphore.tryAcquire());
QCOMPARE(semaphore.available(), 20);
+ semaphore.release(2);
+ QVERIFY(semaphore.tryAcquire(1, 0));
+ QCOMPARE(semaphore.available(), 21);
+
+ QVERIFY(semaphore.tryAcquire(1, 0));
+ QCOMPARE(semaphore.available(), 20);
+
QVERIFY(semaphore.tryAcquire(10));
QCOMPARE(semaphore.available(), 10);
+ semaphore.release(10);
+ QVERIFY(semaphore.tryAcquire(10, 0));
+ QCOMPARE(semaphore.available(), 10);
+
QVERIFY(semaphore.tryAcquire(10));
QCOMPARE(semaphore.available(), 0);
// should not be able to acquire more
QVERIFY(!semaphore.tryAcquire());
+ QVERIFY(!semaphore.tryAcquire(1, 0));
QCOMPARE(semaphore.available(), 0);
QVERIFY(!semaphore.tryAcquire());
+ QVERIFY(!semaphore.tryAcquire(1, 0));
QCOMPARE(semaphore.available(), 0);
QVERIFY(!semaphore.tryAcquire(10));
+ QVERIFY(!semaphore.tryAcquire(10, 0));
QCOMPARE(semaphore.available(), 0);
QVERIFY(!semaphore.tryAcquire(10));
+ QVERIFY(!semaphore.tryAcquire(10, 0));
QCOMPARE(semaphore.available(), 0);
}
@@ -344,6 +365,48 @@ void tst_QSemaphore::tryAcquireWithTimeoutStarvation()
QVERIFY(consumer.wait());
}
+void tst_QSemaphore::tryAcquireWithTimeoutForever_data()
+{
+ QTest::addColumn<int>("timeout");
+ QTest::newRow("-1") << -1;
+
+ // tryAcquire is documented to take any negative value as "forever"
+ QTest::newRow("INT_MIN") << INT_MIN;
+}
+
+void tst_QSemaphore::tryAcquireWithTimeoutForever()
+{
+ enum { WaitTime = 1000 };
+ struct Thread : public QThread {
+ QSemaphore sem;
+
+ void run() override
+ {
+ QTest::qWait(WaitTime);
+ sem.release(2);
+ }
+ };
+
+ QFETCH(int, timeout);
+ Thread t;
+
+ // sanity check it works if we can immediately acquire
+ t.sem.release(11);
+ QVERIFY(t.sem.tryAcquire(1, timeout));
+ QVERIFY(t.sem.tryAcquire(10, timeout));
+
+ // verify that we do wait for at least WaitTime if we can't acquire immediately
+ QElapsedTimer timer;
+ timer.start();
+ t.start();
+ QVERIFY(t.sem.tryAcquire(1, timeout));
+ QVERIFY(timer.elapsed() >= WaitTime);
+
+ QVERIFY(t.wait());
+
+ QCOMPARE(t.sem.available(), 1);
+}
+
const char alphabet[] = "ACGTH";
const int AlphabetSize = sizeof(alphabet) - 1;