LocatorMatcher: Use LoopList element with sub task tree

Change-Id: I92002426421f14ba5705c60418c4c0ac1fd6a7ea
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2024-05-21 23:41:12 +02:00
parent b92ef2c7e7
commit 97caf327ba

View File

@@ -425,15 +425,12 @@ void LocatorMatcher::start()
QTC_ASSERT(!isRunning(), return); QTC_ASSERT(!isRunning(), return);
d->m_output = {}; d->m_output = {};
struct CollectorStorage const Storage<ResultsCollector *> collectorStorage;
{ const LoopList iterator(d->m_tasks);
ResultsCollector *m_collector = nullptr;
};
Storage<CollectorStorage> collectorStorage;
const int filterCount = d->m_tasks.size(); const auto onCollectorSetup = [this, filterCount = d->m_tasks.size(), collectorStorage](
const auto onCollectorSetup = [this, filterCount, collectorStorage](ResultsCollector &collector) { ResultsCollector &collector) {
collectorStorage->m_collector = &collector; *collectorStorage = &collector;
collector.setFilterCount(filterCount); collector.setFilterCount(filterCount);
connect(&collector, &ResultsCollector::serialOutputDataReady, connect(&collector, &ResultsCollector::serialOutputDataReady,
this, [this](const LocatorFilterEntries &serialOutputData) { this, [this](const LocatorFilterEntries &serialOutputData) {
@@ -441,42 +438,31 @@ void LocatorMatcher::start()
emit serialOutputDataReady(serialOutputData); emit serialOutputDataReady(serialOutputData);
}); });
}; };
const auto onCollectorDone = [collectorStorage] { const auto onCollectorDone = [collectorStorage] { *collectorStorage = nullptr; };
collectorStorage->m_collector = nullptr;
};
QList<GroupItem> parallelTasks {parallelLimit(d->m_parallelLimit)}; const auto onTaskTreeSetup = [iterator, input = d->m_input, collectorStorage](TaskTree &taskTree) {
const std::shared_ptr<ResultsDeduplicator> deduplicator = (*collectorStorage)->deduplicator();
const auto onSetup = [this, collectorStorage](const Storage<LocatorStorage> &storage, const Storage<LocatorStorage> storage = iterator->storage;
int index) { const auto onSetup = [storage, input, index = iterator.iteration(), deduplicator] {
return [this, collectorStorage, storage, index] { *storage = std::make_shared<LocatorStoragePrivate>(input, index, deduplicator);
ResultsCollector *collector = collectorStorage->m_collector;
QTC_ASSERT(collector, return);
*storage = std::make_shared<LocatorStoragePrivate>(d->m_input, index,
collector->deduplicator());
}; };
}; taskTree.setRecipe({
int index = 0;
for (const LocatorMatcherTask &task : std::as_const(d->m_tasks)) {
const auto storage = task.storage;
const Group group {
finishAllAndSuccess, finishAllAndSuccess,
storage, storage,
onGroupSetup(onSetup(storage, index)), onGroupSetup(onSetup),
onGroupDone([storage] { storage->finalize(); }), iterator->task,
task.task onGroupDone([storage] { storage->finalize(); })
}; });
parallelTasks << group; };
++index;
}
const Group root { const Group root {
parallel, parallel,
collectorStorage, collectorStorage,
ResultsCollectorTask(onCollectorSetup, onCollectorDone), ResultsCollectorTask(onCollectorSetup, onCollectorDone),
Group { Group {
parallelTasks parallelLimit(d->m_parallelLimit),
iterator,
TaskTreeTask(onTaskTreeSetup)
} }
}; };
d->m_taskTreeRunner.start(root, {}, [this](DoneWith result) { d->m_taskTreeRunner.start(root, {}, [this](DoneWith result) {