tst_QSemaphore: avoid deadlock on test failures

When one of the QCOMPAREs in Consumer::run() fails, the consumer
returns early, leaving the producer deadlocked in a QSemaphore's
acquire() call. Change these to tryAcquire() with a large timeout,
so the producer, too, eventually leaves run().

Change-Id: I7421d43305decd4754e09c8e092363594d1be06b
Reviewed-by: David Faure <david.faure@kdab.com>
bb10
Marc Mutz 2017-02-11 10:50:09 +01:00
parent 737383875e
commit 6c4d75a485
1 changed files with 4 additions and 2 deletions

View File

@ -367,16 +367,18 @@ public:
void run();
};
static const int Timeout = 60 * 1000; // 1min
void Producer::run()
{
for (int i = 0; i < DataSize; ++i) {
freeSpace.acquire();
QVERIFY(freeSpace.tryAcquire(1, Timeout));
buffer[i % BufferSize] = alphabet[i % AlphabetSize];
usedSpace.release();
}
for (int i = 0; i < DataSize; ++i) {
if ((i % ProducerChunkSize) == 0)
freeSpace.acquire(ProducerChunkSize);
QVERIFY(freeSpace.tryAcquire(ProducerChunkSize, Timeout));
buffer[i % BufferSize] = alphabet[i % AlphabetSize];
if ((i % ProducerChunkSize) == (ProducerChunkSize - 1))
usedSpace.release(ProducerChunkSize);