summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-12-01 15:42:23 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-12-01 17:09:18 +0000
commit6e9201e6c7f9482e264e4828c5422bbf91c210e8 (patch)
tree58a38210df9991c3063351dcff85044822c6d1aa
parentd8911209a6781305425d05e78de3eec871c58637 (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.cpp2
-rw-r--r--src/core/jobs/qaspectjobmanager.cpp23
-rw-r--r--src/core/jobs/qaspectjobmanager_p.h1
-rw-r--r--src/core/jobs/qthreadpooler.cpp21
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer.cpp2
-rw-r--r--src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp20
-rw-r--r--src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h1
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer.cpp2
-rw-r--r--src/plugins/renderers/rhi/renderer/renderviewbuilder.cpp20
-rw-r--r--src/plugins/renderers/rhi/renderer/renderviewbuilder_p.h1
-rw-r--r--src/render/jobs/calcboundingvolumejob.cpp3
-rw-r--r--tests/auto/render/opengl/renderer/tst_renderer.cpp4
-rw-r--r--tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp4
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());
}
{