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.cpp39
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