diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-12-01 15:42:23 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2020-12-01 17:09:18 +0000 |
commit | 6e9201e6c7f9482e264e4828c5422bbf91c210e8 (patch) | |
tree | 58a38210df9991c3063351dcff85044822c6d1aa | |
parent | d8911209a6781305425d05e78de3eec871c58637 (diff) |
Fix deadlock when running with QT3D_MAX_THREAD_COUNT=1
Also remove duplication and make QAspectJobManager::idealThreadCount
the centralized function to retrieve expect maximum number of threads.
Change-Id: Iec8d65d368ac7825ef87e883a987551726603adc
Reviewed-by: Mike Krus <mike.krus@kdab.com>
(cherry picked from commit 9ef97eaee6a1e795f0e5c2af7df29148914fb1b3)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/core/jobs/calcboundingvolumejob.cpp | 2 | ||||
-rw-r--r-- | src/core/jobs/qaspectjobmanager.cpp | 23 | ||||
-rw-r--r-- | src/core/jobs/qaspectjobmanager_p.h | 1 | ||||
-rw-r--r-- | src/core/jobs/qthreadpooler.cpp | 21 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderer.cpp | 2 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp | 20 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h | 1 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderer.cpp | 2 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderviewbuilder.cpp | 20 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderviewbuilder_p.h | 1 | ||||
-rw-r--r-- | src/render/jobs/calcboundingvolumejob.cpp | 3 | ||||
-rw-r--r-- | tests/auto/render/opengl/renderer/tst_renderer.cpp | 4 | ||||
-rw-r--r-- | tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp | 4 |
13 files changed, 34 insertions, 70 deletions
diff --git a/src/core/jobs/calcboundingvolumejob.cpp b/src/core/jobs/calcboundingvolumejob.cpp index 5e1b3362d..4bad98b16 100644 --- a/src/core/jobs/calcboundingvolumejob.cpp +++ b/src/core/jobs/calcboundingvolumejob.cpp @@ -293,7 +293,7 @@ void CalculateBoundingVolumeJob::run() }); #if QT_CONFIG(concurrent) - if (dirtyEntities.size() > 1 && QThreadPooler::maxThreadCount() > 1) { + if (dirtyEntities.size() > 1 && QAspectJobManager::idealThreadCount() > 1) { UpdateBoundFunctor functor; ReduceUpdateBoundFunctor reduceFunctor; m_results = QtConcurrent::blockingMappedReduced<decltype(m_results)>(dirtyEntities, functor, reduceFunctor); diff --git a/src/core/jobs/qaspectjobmanager.cpp b/src/core/jobs/qaspectjobmanager.cpp index e99ba4480..e352536cd 100644 --- a/src/core/jobs/qaspectjobmanager.cpp +++ b/src/core/jobs/qaspectjobmanager.cpp @@ -115,7 +115,7 @@ int QAspectJobManager::waitForAllJobs() void QAspectJobManager::waitForPerThreadFunction(JobFunction func, void *arg) { - const int threadCount = m_threadPooler->maxThreadCount(); + const int threadCount = QAspectJobManager::idealThreadCount(); QAtomicInt atomicCount(threadCount); QList<RunnableInterface *> taskList; @@ -128,6 +128,27 @@ void QAspectJobManager::waitForPerThreadFunction(JobFunction func, void *arg) future.waitForFinished(); } + +int QAspectJobManager::idealThreadCount() +{ + static int jobCount = 0; + if (jobCount) + return jobCount; + + const QByteArray maxThreadCount = qgetenv("QT3D_MAX_THREAD_COUNT"); + if (!maxThreadCount.isEmpty()) { + bool conversionOK = false; + const int maxThreadCountValue = maxThreadCount.toInt(&conversionOK); + if (conversionOK) { + jobCount = maxThreadCountValue; + return jobCount; + } + } + + jobCount = QThread::idealThreadCount(); + return jobCount; +} + } // namespace Qt3DCore QT_END_NAMESPACE diff --git a/src/core/jobs/qaspectjobmanager_p.h b/src/core/jobs/qaspectjobmanager_p.h index e27c850f3..169302c34 100644 --- a/src/core/jobs/qaspectjobmanager_p.h +++ b/src/core/jobs/qaspectjobmanager_p.h @@ -78,6 +78,7 @@ public: int waitForAllJobs() override; void waitForPerThreadFunction(JobFunction func, void *arg) override; + static int idealThreadCount(); private: QThreadPooler *m_threadPooler; diff --git a/src/core/jobs/qthreadpooler.cpp b/src/core/jobs/qthreadpooler.cpp index b4c7a2b05..b2f53b7e7 100644 --- a/src/core/jobs/qthreadpooler.cpp +++ b/src/core/jobs/qthreadpooler.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qthreadpooler_p.h" +#include "qaspectjobmanager_p.h" #include <QtCore/QDebug> QT_BEGIN_NAMESPACE @@ -52,7 +53,7 @@ QThreadPooler::QThreadPooler(QObject *parent) , m_threadPool(QThreadPool::globalInstance()) , m_totalRunJobs(0) { - m_threadPool->setMaxThreadCount(QThreadPooler::maxThreadCount()); + m_threadPool->setMaxThreadCount(QAspectJobManager::idealThreadCount()); // Ensures that threads will never be recycled m_threadPool->setExpiryTimeout(-1); } @@ -199,24 +200,6 @@ int QThreadPooler::currentCount() const return m_taskCount.loadRelaxed(); } -int QThreadPooler::maxThreadCount() -{ - static int threadCount = 0; - - if (threadCount == 0) { - threadCount = QThread::idealThreadCount(); - const QByteArray maxThreadCount = qgetenv("QT3D_MAX_THREAD_COUNT"); - if (!maxThreadCount.isEmpty()) { - bool conversionOK = false; - const int maxThreadCountValue = maxThreadCount.toInt(&conversionOK); - if (conversionOK) - threadCount = std::min(threadCount, maxThreadCountValue); - } - } - - return threadCount; -} - } // namespace Qt3DCore QT_END_NAMESPACE diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp index ede7e2234..085556a88 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.cpp +++ b/src/plugins/renderers/opengl/renderer/renderer.cpp @@ -1862,7 +1862,7 @@ std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() m_updatedDisableSubtreeEnablers.push_back(node->peerId()); } - int idealThreadCount = QThreadPooler::maxThreadCount(); + int idealThreadCount = QAspectJobManager::idealThreadCount(); const size_t fgBranchCount = m_frameGraphLeaves.size(); if (fgBranchCount > 1) { diff --git a/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp b/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp index 6ba85db9e..d21c205c3 100644 --- a/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp +++ b/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp @@ -435,26 +435,6 @@ bool RenderViewBuilder::lightCacheNeedsToBeRebuilt() const return m_rebuildFlags.testFlag(RebuildFlag::LightCacheRebuild); } -int RenderViewBuilder::defaultJobCount() -{ - static int jobCount = 0; - if (jobCount) - return jobCount; - - const QByteArray maxThreadCount = qgetenv("QT3D_MAX_THREAD_COUNT"); - if (!maxThreadCount.isEmpty()) { - bool conversionOK = false; - const int maxThreadCountValue = maxThreadCount.toInt(&conversionOK); - if (conversionOK) { - jobCount = maxThreadCountValue; - return jobCount; - } - } - - jobCount = QThread::idealThreadCount(); - return jobCount; -} - int RenderViewBuilder::optimalJobCount() const { return m_optimalParallelJobCount; diff --git a/src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h b/src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h index a2a515d1a..acf4f9892 100644 --- a/src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h +++ b/src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h @@ -119,7 +119,6 @@ public: void setLightCacheNeedsToBeRebuilt(bool needsToBeRebuilt); bool lightCacheNeedsToBeRebuilt() const; - static int defaultJobCount(); int optimalJobCount() const; void setOptimalJobCount(int v); diff --git a/src/plugins/renderers/rhi/renderer/renderer.cpp b/src/plugins/renderers/rhi/renderer/renderer.cpp index 184c94e78..345fffdf8 100644 --- a/src/plugins/renderers/rhi/renderer/renderer.cpp +++ b/src/plugins/renderers/rhi/renderer/renderer.cpp @@ -2313,7 +2313,7 @@ std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() m_updatedDisableSubtreeEnablers.push_back(node->peerId()); } - int idealThreadCount = QThreadPooler::maxThreadCount(); + int idealThreadCount = QAspectJobManager::idealThreadCount(); const size_t fgBranchCount = m_frameGraphLeaves.size(); if (fgBranchCount > 1) { diff --git a/src/plugins/renderers/rhi/renderer/renderviewbuilder.cpp b/src/plugins/renderers/rhi/renderer/renderviewbuilder.cpp index 138d53612..832f550eb 100644 --- a/src/plugins/renderers/rhi/renderer/renderviewbuilder.cpp +++ b/src/plugins/renderers/rhi/renderer/renderviewbuilder.cpp @@ -393,26 +393,6 @@ bool RenderViewBuilder::lightCacheNeedsToBeRebuilt() const return m_rebuildFlags.testFlag(RebuildFlag::LightCacheRebuild); } -int RenderViewBuilder::defaultJobCount() -{ - static int jobCount = 0; - if (jobCount) - return jobCount; - - const QByteArray maxThreadCount = qgetenv("QT3D_MAX_THREAD_COUNT"); - if (!maxThreadCount.isEmpty()) { - bool conversionOK = false; - const int maxThreadCountValue = maxThreadCount.toInt(&conversionOK); - if (conversionOK) { - jobCount = maxThreadCountValue; - return jobCount; - } - } - - jobCount = QThread::idealThreadCount(); - return jobCount; -} - int RenderViewBuilder::optimalJobCount() const { return m_optimalParallelJobCount; diff --git a/src/plugins/renderers/rhi/renderer/renderviewbuilder_p.h b/src/plugins/renderers/rhi/renderer/renderviewbuilder_p.h index 790d2d5e6..f7c4f606c 100644 --- a/src/plugins/renderers/rhi/renderer/renderviewbuilder_p.h +++ b/src/plugins/renderers/rhi/renderer/renderviewbuilder_p.h @@ -118,7 +118,6 @@ public: void setLightCacheNeedsToBeRebuilt(bool needsToBeRebuilt); bool lightCacheNeedsToBeRebuilt() const; - static int defaultJobCount(); int optimalJobCount() const; void setOptimalJobCount(int v); diff --git a/src/render/jobs/calcboundingvolumejob.cpp b/src/render/jobs/calcboundingvolumejob.cpp index e11651628..02cdce0ca 100644 --- a/src/render/jobs/calcboundingvolumejob.cpp +++ b/src/render/jobs/calcboundingvolumejob.cpp @@ -43,6 +43,7 @@ #include <Qt3DCore/qboundingvolume.h> #include <Qt3DCore/private/qabstractfrontendnodemanager_p.h> #include <Qt3DCore/private/qgeometry_p.h> +#include <Qt3DCore/private/qaspectjobmanager_p.h> #include <Qt3DRender/private/nodemanagers_p.h> #include <Qt3DRender/private/entity_p.h> #include <Qt3DRender/private/renderlogging_p.h> @@ -469,7 +470,7 @@ void CalculateBoundingVolumeJob::run() updatedGeometries.reserve(entities.size()); #if QT_CONFIG(concurrent) - if (entities.size() > 1) { + if (entities.size() > 1 && QAspectJobManager::idealThreadCount() > 1) { UpdateBoundFunctor functor; functor.manager = m_manager; ReduceUpdateBoundFunctor reduceFunctor; diff --git a/tests/auto/render/opengl/renderer/tst_renderer.cpp b/tests/auto/render/opengl/renderer/tst_renderer.cpp index 1e83d8ab2..d4a11fa14 100644 --- a/tests/auto/render/opengl/renderer/tst_renderer.cpp +++ b/tests/auto/render/opengl/renderer/tst_renderer.cpp @@ -140,9 +140,9 @@ private Q_SLOTS: // filterEntityByLayerJob, // syncFilterEntityByLayerJob - const int singleRenderViewCommandRebuildJobCount = 1 + Qt3DRender::Render::OpenGL::RenderViewBuilder::defaultJobCount(); + const int singleRenderViewCommandRebuildJobCount = 1 + Qt3DCore::QAspectJobManager::idealThreadCount(); - const int singleRenderViewJobCount = 8 + 1 * Qt3DRender::Render::OpenGL::RenderViewBuilder::defaultJobCount(); + const int singleRenderViewJobCount = 8 + 1 * Qt3DCore::QAspectJobManager::idealThreadCount(); // RenderViewBuilder renderViewJob, // syncRenderViewInitializationJob, // syncFrustumCullingJob, diff --git a/tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp b/tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp index 6627e3c08..ec9999e94 100644 --- a/tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp +++ b/tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp @@ -259,9 +259,9 @@ private Q_SLOTS: QVERIFY(renderViewBuilder.filterEntityByLayerJob().isNull()); QVERIFY(renderViewBuilder.syncFilterEntityByLayerJob().isNull()); - QCOMPARE(renderViewBuilder.renderViewCommandUpdaterJobs().size(), Qt3DRender::Render::OpenGL::RenderViewBuilder::defaultJobCount()); + QCOMPARE(renderViewBuilder.renderViewCommandUpdaterJobs().size(), Qt3DCore::QAspectJobManager::idealThreadCount()); QCOMPARE(renderViewBuilder.materialGathererJobs().size(), 0); - QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 8 + 1 * Qt3DRender::Render::OpenGL::RenderViewBuilder::defaultJobCount()); + QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 8 + 1 * Qt3DCore::QAspectJobManager::idealThreadCount()); } { |