| 244 | } |
| 245 | |
| 246 | QList<BaseTask *> Flow::getExecutionOrder() const |
| 247 | { |
| 248 | QMutexLocker locker(&m_flowMutex); |
| 249 | |
| 250 | QList<BaseTask *> result; |
| 251 | QSet<BaseTask *> visited; |
| 252 | QList<BaseTask *> allTasks = m_tasks.values(); |
| 253 | |
| 254 | std::function<void(BaseTask *)> visit = [&](BaseTask *task) { |
| 255 | if (visited.contains(task)) { |
| 256 | return; |
| 257 | } |
| 258 | |
| 259 | visited.insert(task); |
| 260 | |
| 261 | QList<BaseTask *> dependencies = getTaskDependencies(task); |
| 262 | for (BaseTask *dependency : dependencies) { |
| 263 | visit(dependency); |
| 264 | } |
| 265 | |
| 266 | result.append(task); |
| 267 | }; |
| 268 | |
| 269 | for (BaseTask *task : allTasks) { |
| 270 | visit(task); |
| 271 | } |
| 272 | |
| 273 | return result; |
| 274 | } |
| 275 | |
| 276 | bool Flow::detectCircularDependencies() const |
| 277 | { |