summaryrefslogtreecommitdiffstats
path: root/src/core/jobs/dependencyhandler.cpp
diff options
context:
space:
mode:
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;