Renderer::doRender scene3dBlocking fixes

-Reorder sleep and locks
-Properly protect isFrameQueueComplete lookup
-Reread queueIsEmpty which could have been updated

Change-Id: I2b5a52284bbb3ddb48483c5bf73779e335c8bdda
Task-number: QTBUG-71294
Reviewed-by: Christian Andersen <csandersen3@gmail.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
This commit is contained in:
Paul Lemire 2018-10-23 09:56:00 +02:00
parent fd9f66d17d
commit 726be38f77
1 changed files with 7 additions and 4 deletions

View File

@ -629,18 +629,21 @@ void Renderer::doRender(bool scene3dBlocking)
// Lock the mutex to protect access to the renderQueue while we look for its state
QMutexLocker locker(m_renderQueue->mutex());
bool queueIsComplete = m_renderQueue->isFrameQueueComplete();
const bool queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0;
bool queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0;
// Scene3D Blocking Mode
if (scene3dBlocking && !queueIsComplete && !queueIsEmpty) {
int i = 0;
// We wait at most 10ms to avoid a case we could never recover from
while (!queueIsComplete && i++ < 10) {
QThread::msleep(1);
while (!queueIsComplete && !queueIsEmpty && i++ < 10) {
qCDebug(Backend) << Q_FUNC_INFO << "Waiting for ready queue (try:" << i << "/ 10)";
locker.unlock();
queueIsComplete = m_renderQueue->isFrameQueueComplete();
// Give worker threads a chance to complete the queue
QThread::msleep(1);
locker.relock();
queueIsComplete = m_renderQueue->isFrameQueueComplete();
// This could become true if we've tried to shutdown
queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0;
}
}