diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2017-09-12 12:10:03 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-09-12 12:39:05 +0100 |
commit | 3f03499bf8a7cf3c3f8d19a020179c1205980bde (patch) | |
tree | 518b0ef3fb1b31d3856f43124150ef41acb8c1aa /src/core/jobs/qthreadpooler.cpp | |
parent | 8a4b9ebadb9e63ae367694f04786c7faf6306f27 (diff) | |
parent | bf5fd7a78c91e29332ce70ad844b756150f32f18 (diff) |
Merge branch '5.9' into 5.10
Change-Id: Id6a3d4ec579a2f2a2e559c22a2293d0e184f0bdf
Diffstat (limited to 'src/core/jobs/qthreadpooler.cpp')
-rw-r--r-- | src/core/jobs/qthreadpooler.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/src/core/jobs/qthreadpooler.cpp b/src/core/jobs/qthreadpooler.cpp index 57a1b09a6..6819faca7 100644 --- a/src/core/jobs/qthreadpooler.cpp +++ b/src/core/jobs/qthreadpooler.cpp @@ -48,8 +48,6 @@ #include <QtCore/QCoreApplication> #endif -#include <Qt3DCore/private/dependencyhandler_p.h> - QT_BEGIN_NAMESPACE namespace Qt3DCore { @@ -62,7 +60,6 @@ QThreadPooler::QThreadPooler(QObject *parent) : QObject(parent) , m_futureInterface(nullptr) , m_mutex() - , m_dependencyHandler(nullptr) , m_taskCount(0) { const QByteArray maxThreadCount = qgetenv("QT3D_MAX_THREAD_COUNT"); @@ -86,12 +83,6 @@ QThreadPooler::~QThreadPooler() locker.unlock(); } -void QThreadPooler::setDependencyHandler(DependencyHandler *handler) -{ - m_dependencyHandler = handler; - m_dependencyHandler->setMutex(&m_mutex); -} - void QThreadPooler::enqueueTasks(const QVector<RunnableInterface *> &tasks) { // The caller have to set the mutex @@ -99,7 +90,14 @@ void QThreadPooler::enqueueTasks(const QVector<RunnableInterface *> &tasks) for (QVector<RunnableInterface *>::const_iterator it = tasks.cbegin(); it != end; ++it) { - if (!m_dependencyHandler->hasDependency((*it)) && !(*it)->reserved()) { + + // Only AspectTaskRunnables are checked for dependencies. + static const auto hasDependencies = [](RunnableInterface *task) -> bool { + return (task->type() == RunnableInterface::RunnableType::AspectTask) + && (static_cast<AspectTaskRunnable *>(task)->m_dependerCount > 0); + }; + + if (!hasDependencies(*it) && !(*it)->reserved()) { (*it)->setReserved(true); (*it)->setPooler(this); m_threadPool.start((*it)); @@ -113,10 +111,19 @@ void QThreadPooler::taskFinished(RunnableInterface *task) release(); - if (task->dependencyHandler()) { - const QVector<RunnableInterface *> freedTasks = m_dependencyHandler->freeDependencies(task); - if (!freedTasks.empty()) - enqueueTasks(freedTasks); + if (task->type() == RunnableInterface::RunnableType::AspectTask) { + AspectTaskRunnable *aspectTask = static_cast<AspectTaskRunnable *>(task); + const auto &dependers = aspectTask->m_dependers; + for (auto it = dependers.begin(); it != dependers.end(); ++it) { + aspectTask = static_cast<AspectTaskRunnable *>(*it); + if (--aspectTask->m_dependerCount == 0) { + if (!aspectTask->reserved()) { + aspectTask->setReserved(true); + aspectTask->setPooler(this); + m_threadPool.start(aspectTask); + } + } + } } if (currentCount() == 0) { |