summaryrefslogtreecommitdiffstats
path: root/src/core/jobs/dependencyhandler.cpp
diff options
context:
space:
mode:
authorMika Salmela <mika.salmela@theqtcompany.com>2015-04-27 16:47:15 +0300
committerMika Salmela <mika.salmela@theqtcompany.com>2015-04-27 14:29:23 +0000
commit21c9dfef8bf81f7a1910d5d07baf9fdab39750a4 (patch)
tree655f4db942c9ccc040310b96a7c325b87af7bc80 /src/core/jobs/dependencyhandler.cpp
parent2e34ef2d053cfa0c152442a758dda6296902c7c8 (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.cpp25
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;