summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-07-27 17:14:33 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-08-04 07:25:56 +0000
commitb3ad79419b038b41cc7d6460131b302ba562a4fe (patch)
treed5f47e085663f52d4693a1857f9fbc1c0721175a
parentb865079dc5b0910f5277deceda44adfc3af3c522 (diff)
Protect accesses to the Render cache
It seems Qt6 QHash implementation might rehash on lookups which leads to data races in case of concurrent lookups Change-Id: I9fff2c8303fdd5908acc27d6d98fc963876d65cc Reviewed-by: Mike Krus <mike.krus@kdab.com> (cherry picked from commit 308fd2598eab048de45df274c408fb2d43fb3bcf)
-rw-r--r--src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp b/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp
index e971c3f3c..7dad70483 100644
--- a/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp
+++ b/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp
@@ -79,6 +79,7 @@ public:
// Rebuild RenderCommands for all entities in RV (ignoring filtering)
RendererCache *cache = m_renderer->cache();
+ QMutexLocker lock(cache->mutex());
Q_ASSERT(cache->leafNodeCache.contains(m_leafNode));
// The cache leaf should already have been created so we don't need to protect the access
@@ -284,6 +285,7 @@ public:
///////// CACHE LOCKED ////////////
// Retrieve Data from Cache
RendererCache *cache = m_renderer->cache();
+ QMutexLocker lock(cache->mutex());
Q_ASSERT(cache->leafNodeCache.contains(m_leafNode));
// We don't need to protect the cache access as
@@ -506,6 +508,7 @@ public:
void operator()()
{
+ QMutexLocker lock(m_renderer->cache()->mutex());
Q_ASSERT(m_renderer->cache()->leafNodeCache.contains(m_leafNode));
// The cache leaf should already have been created so we don't need to protect the access
RendererCache::LeafNodeData &dataCacheForLeaf = m_renderer->cache()->leafNodeCache[m_leafNode];
@@ -535,7 +538,7 @@ public:
{
// The cache leaf was created by SyncRenderViewPostInitialization on which we depend
// so we don't need to protect the access
-
+ QMutexLocker lock(m_renderer->cache()->mutex());
RendererCache::LeafNodeData &dataCacheForLeaf = m_renderer->cache()->leafNodeCache[m_leafNode];
dataCacheForLeaf.materialParameterGatherer.clear();