diff options
author | Mika Salmela <mika.salmela@theqtcompany.com> | 2015-04-27 16:47:15 +0300 |
---|---|---|
committer | Mika Salmela <mika.salmela@theqtcompany.com> | 2015-04-27 14:29:23 +0000 |
commit | 21c9dfef8bf81f7a1910d5d07baf9fdab39750a4 (patch) | |
tree | 655f4db942c9ccc040310b96a7c325b87af7bc80 /src/core/jobs/dependencyhandler.cpp | |
parent | 2e34ef2d053cfa0c152442a758dda6296902c7c8 (diff) |
Add checks for double task execution
On ThreadPooler done tasks are also removed from the dependency pair
list. Also added reserved flag for tasks. These prevent tasks getting
into execution more than once.
Change-Id: Ia9e5377c883ad08079a9af32c4a2a294db425eb2
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
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; |