diff options
Diffstat (limited to 'src/core/jobs/dependencyhandler.cpp')
-rw-r--r-- | src/core/jobs/dependencyhandler.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/core/jobs/dependencyhandler.cpp b/src/core/jobs/dependencyhandler.cpp index 118602a61..a805638fe 100644 --- a/src/core/jobs/dependencyhandler.cpp +++ b/src/core/jobs/dependencyhandler.cpp @@ -69,13 +69,25 @@ namespace { bool operator()(const Dependency &candidate) const { if (dependee == candidate.dependee) { - freedList->append(candidate.depender); + 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). @@ -118,14 +130,19 @@ bool DependencyHandler::hasDependency(const RunnableInterface *depender) * 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 *dependee) +QVector<RunnableInterface *> DependencyHandler::freeDependencies(const RunnableInterface *task) { - const QMutexLocker locker(m_mutex); + // 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(dependee, &freedList)), + DependeeEquals(task, &freedList)), m_dependencyMap.end()); return freedList; |