From b3ad79419b038b41cc7d6460131b302ba562a4fe Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Mon, 27 Jul 2020 17:14:33 +0200 Subject: 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 (cherry picked from commit 308fd2598eab048de45df274c408fb2d43fb3bcf) --- src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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(); -- cgit v1.2.3