aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/qsgthreadedrenderloop.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-08-26 09:43:33 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-08-26 09:51:56 +0200
commite9e6f70d355499d551a26960d236644f92ea38af (patch)
tree542840d4b3b8ff82d6fab38c9ad2615d3592b793 /src/quick/scenegraph/qsgthreadedrenderloop.cpp
parent916ced089f37d96ca8ef1cdb938791247bd44b72 (diff)
parenteadc35f499edd25d5d1c5f803db1d61675c1cc2c (diff)
Merge remote-tracking branch 'origin/5.3' into 5.4
Conflicts: src/qml/qml/qqmlobjectcreator_p.h Change-Id: I60858ddb46866a8fa1a8576bb05b412afeeb4e41
Diffstat (limited to 'src/quick/scenegraph/qsgthreadedrenderloop.cpp')
-rw-r--r--src/quick/scenegraph/qsgthreadedrenderloop.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
index b69058a504..7bf1d759f7 100644
--- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp
+++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
@@ -1037,6 +1037,18 @@ void QSGThreadedRenderLoop::releaseResources(Window *w, bool inDestructor)
w->thread->postEvent(new WMTryReleaseEvent(window, inDestructor, fallback));
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) {
+ qCDebug(QSG_LOG_RENDERLOOP) << " - waiting for render thread to exit" << w->window;
+ w->thread->wait();
+ qCDebug(QSG_LOG_RENDERLOOP) << " - render thread finished" << w->window;
+ }
}
w->thread->mutex.unlock();
}