summaryrefslogtreecommitdiffstats
path: root/src
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 /src
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)
Diffstat (limited to 'src')
-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();