diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-07-27 17:14:33 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-08-04 07:25:56 +0000 |
commit | b3ad79419b038b41cc7d6460131b302ba562a4fe (patch) | |
tree | d5f47e085663f52d4693a1857f9fbc1c0721175a | |
parent | b865079dc5b0910f5277deceda44adfc3af3c522 (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.cpp | 5 |
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(); |