From 68ac67af2346c89ea2b482bbcf6c3636d9c31e66 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Thu, 14 Aug 2014 06:38:12 +0000 Subject: Fix potential deadlook in threaded renderloop. Change-Id: I415e632aa4e584c8fca745581f25a676db0eae42 Reviewed-by: Giulio Camuffo Reviewed-by: Robin Burchell --- src/quick/scenegraph/qsgthreadedrenderloop.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index 296050ec2f..c17eb916ae 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -1116,6 +1116,18 @@ void QSGThreadedRenderLoop::releaseResources(QQuickWindow *window, bool inDestru w->thread->waitCondition.wait(&w->thread->mutex); delete fallback; + + // Avoid a shutdown race condition. + // If SG is invalidated and 'active' becomes false, the thread's run() + // method will exit. handleExposure() relies on QThread::isRunning() (because it + // potentially needs to start the thread again) and our mutex cannot be used to + // track the thread stopping, so we wait a few nanoseconds extra so the thread + // can exit properly. + if (!w->thread->active) { + QSG_GUI_DEBUG(w->window, " - waiting for render thread to exit"); + w->thread->wait(); + QSG_GUI_DEBUG(w->window, " - render thread finished"); + } } w->thread->mutex.unlock(); } -- cgit v1.2.3