forked from qt-creator/qt-creator
LocatorMatcher: Use LoopList element with sub task tree
Change-Id: I92002426421f14ba5705c60418c4c0ac1fd6a7ea Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user