summaryrefslogtreecommitdiffstats
path: root/src/core/jobs/qaspectjobmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/jobs/qaspectjobmanager.cpp')
-rw-r--r--src/core/jobs/qaspectjobmanager.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/core/jobs/qaspectjobmanager.cpp b/src/core/jobs/qaspectjobmanager.cpp
index cabe2a941..af1774e65 100644
--- a/src/core/jobs/qaspectjobmanager.cpp
+++ b/src/core/jobs/qaspectjobmanager.cpp
@@ -42,6 +42,10 @@
#include "job.h"
#include "weaverjob_p.h"
#include "qaspectjobmanager_p.h"
+#ifdef THREAD_POOLER
+#include "task_p.h"
+#include "dependencyhandler_p.h"
+#endif
#include <QAtomicInt>
#include <QDebug>
@@ -104,16 +108,31 @@ QAspectJobManager::QAspectJobManager(QObject *parent)
: QAbstractAspectJobManager(*new QAspectJobManagerPrivate(this), parent)
{
Q_D(QAspectJobManager);
+#ifndef THREAD_POOLER
d->m_weaver = new ThreadWeaver::Queue(this);
d->m_weaver->setMaximumNumberOfThreads(QThread::idealThreadCount());
+#else
+ d->m_threadPooler = new QThreadPooler(this);
+ d->m_threadPooler->setMaxThreadCount(QThread::idealThreadCount());
+
+ d->m_dependencyHandler = new DependencyHandler();
+ d->m_threadPooler->setDependencyHandler(d->m_dependencyHandler);
+#endif
}
QAspectJobManager::QAspectJobManager(QAspectJobManagerPrivate &dd, QObject *parent)
: QAbstractAspectJobManager(dd, parent)
{
Q_D(QAspectJobManager);
+#ifndef THREAD_POOLER
d->m_weaver = new ThreadWeaver::Queue(this);
d->m_weaver->setMaximumNumberOfThreads(QThread::idealThreadCount());
+#else
+ d->m_threadPooler = new QThreadPooler(this);
+ d->m_threadPooler->setMaxThreadCount(QThread::idealThreadCount());
+
+ d->m_dependencyHandler = new DependencyHandler();
+#endif
}
void QAspectJobManager::initialize()
@@ -123,6 +142,8 @@ void QAspectJobManager::initialize()
void QAspectJobManager::enqueueJobs(const QVector<QAspectJobPtr> &jobQueue)
{
Q_D(QAspectJobManager);
+
+#ifndef THREAD_POOLER
// Convert QJobs to ThreadWeaver::Jobs
QHash<QAspectJob *, QSharedPointer<WeaverJob> > jobsMap;
Q_FOREACH (const QAspectJobPtr &job, jobQueue) {
@@ -150,17 +171,55 @@ void QAspectJobManager::enqueueJobs(const QVector<QAspectJobPtr> &jobQueue)
QSharedPointer<WeaverJob> weaverJob = jobsMap.value(job.data());
d->m_weaver->enqueue(weaverJob);
}
+#else
+ // Convert QJobs to Tasks
+ QHash<QAspectJob *, QSharedPointer<AspectTask>> tasksMap;
+ Q_FOREACH (const QAspectJobPtr &job, jobQueue) {
+ QSharedPointer<AspectTask> task = QSharedPointer<AspectTask>::create();
+ task->m_job = job;
+ tasksMap.insert(job.data(), task);
+ }
+
+ // Resolve dependencies
+ QVector<Dependency> dependencyList;
+
+ Q_FOREACH (const QAspectJobPtr &job, jobQueue) {
+ const QVector<QWeakPointer<QAspectJob> > &deps = job->dependencies();
+
+ Q_FOREACH (const QWeakPointer<QAspectJob> &dep, deps) {
+ QSharedPointer<AspectTask> taskDependee = tasksMap.value(dep.data());
+
+ if (taskDependee) {
+ QSharedPointer<AspectTask> taskDepender = tasksMap.value(job.data());
+ dependencyList.append(Dependency(taskDepender, taskDependee));
+ taskDependee->setDependencyHandler(d->m_dependencyHandler);
+ }
+ }
+ }
+ d->m_dependencyHandler->addDependencies(qMove(dependencyList));
+
+ Q_FOREACH (const QAspectJobPtr &job, jobQueue) {
+ QSharedPointer<AspectTask> task = tasksMap.value(job.data());
+ d->m_threadPooler->enqueueTask(task);
+ }
+#endif
}
void QAspectJobManager::waitForAllJobs()
{
Q_D(QAspectJobManager);
+#ifndef THREAD_POOLER
d->m_weaver->finish();
+#else
+ d->m_threadPooler->flush();
+#endif
}
void QAspectJobManager::waitForPerThreadFunction(JobFunction func, void *arg)
{
Q_D(QAspectJobManager);
+
+#ifndef THREAD_POOLER
const int threadCount = d->m_weaver->maximumNumberOfThreads();
QAtomicInt atomicCount(threadCount);
@@ -170,6 +229,17 @@ void QAspectJobManager::waitForPerThreadFunction(JobFunction func, void *arg)
}
d->m_weaver->finish();
+#else
+ const int threadCount = d->m_threadPooler->maxThreadCount();
+ QAtomicInt atomicCount(threadCount);
+
+ for (int i = 0; i < threadCount; ++i) {
+ QSharedPointer<SynchronizedTask> syncTask(new SynchronizedTask(func, arg, &atomicCount));
+ d->m_threadPooler->enqueueTask(syncTask);
+ }
+
+ d->m_threadPooler->flush();
+#endif
}
} // namespace Qt3D