summaryrefslogtreecommitdiffstats
path: root/src/core/jobs/dependencyhandler.cpp
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@qt.io>2017-08-25 10:14:49 +0200
committerLars Knoll <lars.knoll@qt.io>2017-09-06 18:10:13 +0000
commitd5926d26e2b39920acd1ecd22a33bc65c3cf49ad (patch)
treee1d244723c345763c04eddc7bc81d38fae3d2029 /src/core/jobs/dependencyhandler.cpp
parente9e3208dd7c2e2f755948b1838faa94c2802cc30 (diff)
Improve dependency look-up
Simplify the dependency look-up by moving the dependers directly into the dependee runnable, each task is then responsible for updating their dependers and queue them up when they are free to be run. Change-Id: I96295d47cecd507a864965e1fb65f2ff9af68111 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/core/jobs/dependencyhandler.cpp')
-rw-r--r--src/core/jobs/dependencyhandler.cpp157
1 files changed, 0 insertions, 157 deletions
diff --git a/src/core/jobs/dependencyhandler.cpp b/src/core/jobs/dependencyhandler.cpp
deleted file mode 100644
index 6a925d037..000000000
--- a/src/core/jobs/dependencyhandler.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt3D module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "dependencyhandler_p.h"
-
-#include <iterator>
-
-QT_BEGIN_NAMESPACE
-
-namespace Qt3DCore {
-
-namespace {
- template <template <typename T> class Op>
- struct ByDepender {
- typedef bool result_type;
-
- bool operator()(const RunnableInterface *lhs, const RunnableInterface *rhs) const Q_DECL_NOTHROW
- { return Op<const RunnableInterface *>()(lhs, rhs); }
-
- bool operator()(const RunnableInterface *lhs, const Dependency &rhs) const Q_DECL_NOTHROW
- { return operator()(lhs, rhs.depender); }
-
- bool operator()(const Dependency &lhs, const RunnableInterface *rhs) const Q_DECL_NOTHROW
- { return operator()(lhs.depender, rhs); }
-
- bool operator()(const Dependency &lhs, const Dependency &rhs) const Q_DECL_NOTHROW
- { return operator()(lhs.depender, rhs.depender); }
- };
-
- struct DependeeEquals : std::unary_function<Dependency, bool>
- {
- const RunnableInterface *dependee;
- QVector<RunnableInterface *> *freedList;
- explicit DependeeEquals(const RunnableInterface *dependee, QVector<RunnableInterface *> *freedList)
- : dependee(qMove(dependee)), freedList(qMove(freedList)) {}
- bool operator()(const Dependency &candidate) const
- {
- if (dependee == candidate.dependee) {
- if (!candidate.depender->reserved())
- freedList->append(candidate.depender);
- return true;
- }
- return false;
- }
- };
-
- struct DependerEquals : std::unary_function<Dependency, bool>
- {
- const RunnableInterface *depender;
- explicit DependerEquals(const RunnableInterface *depender)
- : depender(qMove(depender)) {}
- bool operator()(const Dependency &candidate) const
- {
- return depender == candidate.depender;
- }
- };
-
- struct ByDependerThenDependee : std::binary_function<Dependency, Dependency, bool>
- {
- // Defines a lexicographical order (depender first).
- bool operator()(const Dependency &lhs, const Dependency &rhs)
- {
- if (lhs.depender < rhs.depender) return true;
- if (rhs.depender < lhs.depender) return false;
- return lhs.dependee < rhs.dependee;
- }
- };
-}
-
-DependencyHandler::DependencyHandler()
- : m_mutex()
-{
-}
-
-void DependencyHandler::addDependencies(QVector<Dependency> dependencies)
-{
- std::sort(dependencies.begin(), dependencies.end(), ByDependerThenDependee());
-
- const QMutexLocker locker(m_mutex);
-
- QVector<Dependency> newDependencyMap;
- newDependencyMap.reserve(dependencies.size() + m_dependencyMap.size());
- std::set_union(m_dependencyMap.begin(), m_dependencyMap.end(),
- dependencies.begin(), dependencies.end(),
- std::back_inserter(newDependencyMap), ByDependerThenDependee());
- m_dependencyMap.swap(newDependencyMap); // commit
-}
-
-bool DependencyHandler::hasDependency(const RunnableInterface *depender)
-{
- // The caller has to set the mutex, which is QThreadPooler::enqueueTasks
-
- return std::binary_search(m_dependencyMap.begin(), m_dependencyMap.end(),
- depender, ByDepender<std::less>());
-}
-
-/*
- * Removes all the entries on the m_dependencyMap that have given task as a dependee,
- * i.e. entries where the dependency is on the given task.
- */
-QVector<RunnableInterface *> DependencyHandler::freeDependencies(const RunnableInterface *task)
-{
- // The caller has to set the mutex, which is QThreadPooler::taskFinished
-
- m_dependencyMap.erase(std::remove_if(m_dependencyMap.begin(),
- m_dependencyMap.end(),
- DependerEquals(task)),
- m_dependencyMap.end());
-
- QVector<RunnableInterface *> freedList;
- m_dependencyMap.erase(std::remove_if(m_dependencyMap.begin(),
- m_dependencyMap.end(),
- DependeeEquals(task, &freedList)),
- m_dependencyMap.end());
-
- return freedList;
-}
-
-} // namespace Qt3DCore
-
-QT_END_NAMESPACE