diff options
Diffstat (limited to 'src/core/jobs/dependencyhandler.cpp')
-rw-r--r-- | src/core/jobs/dependencyhandler.cpp | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/src/core/jobs/dependencyhandler.cpp b/src/core/jobs/dependencyhandler.cpp index 9778ede58..118602a61 100644 --- a/src/core/jobs/dependencyhandler.cpp +++ b/src/core/jobs/dependencyhandler.cpp @@ -47,13 +47,13 @@ namespace { struct ByDepender { typedef bool result_type; - bool operator()(const QSharedPointer<TaskInterface> &lhs, const QSharedPointer<TaskInterface> &rhs) const Q_DECL_NOTHROW - { return Op<QSharedPointer<TaskInterface> >()(lhs, rhs); } + bool operator()(const RunnableInterface *lhs, const RunnableInterface *rhs) const Q_DECL_NOTHROW + { return Op<const RunnableInterface *>()(lhs, rhs); } - bool operator()(const QSharedPointer<TaskInterface> &lhs, const Dependency &rhs) const Q_DECL_NOTHROW + bool operator()(const RunnableInterface *lhs, const Dependency &rhs) const Q_DECL_NOTHROW { return operator()(lhs, rhs.depender); } - bool operator()(const Dependency &lhs, const QSharedPointer<TaskInterface> &rhs) const Q_DECL_NOTHROW + 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 @@ -62,12 +62,17 @@ namespace { struct DependeeEquals : std::unary_function<Dependency, bool> { - QSharedPointer<TaskInterface> dependee; - explicit DependeeEquals(QSharedPointer<TaskInterface> dependee) - : dependee(qMove(dependee)) {} + 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 { - return dependee == candidate.dependee; + if (dependee == candidate.dependee) { + freedList->append(candidate.depender); + return true; + } + return false; } }; @@ -91,7 +96,7 @@ void DependencyHandler::addDependencies(QVector<Dependency> dependencies) { std::sort(dependencies.begin(), dependencies.end(), ByDependerThenDependee()); - const QMutexLocker locker(&m_mutex); + const QMutexLocker locker(m_mutex); QVector<Dependency> newDependencyMap; newDependencyMap.reserve(dependencies.size() + m_dependencyMap.size()); @@ -101,9 +106,9 @@ void DependencyHandler::addDependencies(QVector<Dependency> dependencies) m_dependencyMap.swap(newDependencyMap); // commit } -bool DependencyHandler::hasDependency(const QSharedPointer<TaskInterface> &depender) +bool DependencyHandler::hasDependency(const RunnableInterface *depender) { - const QMutexLocker locker(&m_mutex); + // 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>()); @@ -113,13 +118,17 @@ bool DependencyHandler::hasDependency(const QSharedPointer<TaskInterface> &depen * 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. */ -void DependencyHandler::freeDependencies(const QSharedPointer<TaskInterface> &dependee) +QVector<RunnableInterface *> DependencyHandler::freeDependencies(const RunnableInterface *dependee) { - const QMutexLocker locker(&m_mutex); + const QMutexLocker locker(m_mutex); - m_dependencyMap.erase(std::remove_if(m_dependencyMap.begin(), m_dependencyMap.end(), - DependeeEquals(dependee)), + QVector<RunnableInterface *> freedList; + m_dependencyMap.erase(std::remove_if(m_dependencyMap.begin(), + m_dependencyMap.end(), + DependeeEquals(dependee, &freedList)), m_dependencyMap.end()); + + return freedList; } } // namespace Qt3D |