summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Andersen <csa@ticra.com>2018-10-20 22:48:11 +0200
committerChristian Andersen <csandersen3@gmail.com>2018-10-23 17:36:10 +0000
commit3314694004b825263c9b9f2d69bd85da806ccbbc (patch)
treee7e45561f553f2b8c6aa73b3e89c496fc3ccb244
parentf575334691dedc5e34e6391fe638f313de8270eb (diff)
Fix crash due to racecondition in renderer on shutdown
Protects access to m_renderQueue using the m_renderQueue mutex on shutdown. When a Qt3DWindow is deleted it signals the aspect thread to do early cleanup, the aspect thread calls Renderer::shutdown which in turn resets m_renderQueue. Meanwhile the render thread may be working on m_renderQueue, this leads to a double free of the front render view in m_renderQueue (and potentially other stuff). Fixes: QTBUG-69877 Change-Id: Ifd018597dbdb2f1538494932c907c63e8db9c715 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp
index e1d237622..8039b6412 100644
--- a/src/render/renderers/opengl/renderer/renderer.cpp
+++ b/src/render/renderers/opengl/renderer/renderer.cpp
@@ -106,6 +106,7 @@
#include <QSurface>
#include <QElapsedTimer>
#include <QLibraryInfo>
+#include <QMutexLocker>
#include <QPluginLoader>
#include <QDir>
#include <QUrl>
@@ -444,8 +445,10 @@ void Renderer::shutdown()
// We delete any renderqueue that we may not have had time to render
// before the surface was destroyed
+ QMutexLocker lockRenderQueue(m_renderQueue->mutex());
qDeleteAll(m_renderQueue->nextFrameQueue());
m_renderQueue->reset();
+ lockRenderQueue.unlock();
m_commandThread->shutdown();