From 37b6cb7f905e37363d67ad5f7d267e0265a83514 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 3 Nov 2023 18:50:32 +0100 Subject: [PATCH] TaskTree: Get rid of onGroupError element Make it possible to setup onGroupDone element with additional OnDone argument. The onGroupDone handler may accept extra DoneResult argument. The onGroupDone handler may also tweak the success bit of a group. All above features conform to the behavior of the task done handler. Task-number: QTCREATORBUG-29834 Change-Id: I125bdfe155e585678fb33410632246401cbc9390 Reviewed-by: Reviewed-by: hjk --- src/libs/solutions/tasking/tasktree.cpp | 58 +++-- src/libs/solutions/tasking/tasktree.h | 82 +++++--- src/plugins/android/androidbuildapkstep.cpp | 2 +- .../autotoolsprojectmanager/autogenstep.cpp | 7 +- .../autoreconfstep.cpp | 7 +- .../autotoolsprojectmanager/configurestep.cpp | 7 +- .../cmakeprojectmanager/cmakebuildstep.cpp | 6 +- .../coreplugin/locator/ilocatorfilter.cpp | 7 +- src/plugins/coreplugin/locator/locator.cpp | 2 +- src/plugins/cppeditor/cppprojectupdater.cpp | 12 +- src/plugins/diffeditor/diffeditorplugin.cpp | 19 +- src/plugins/git/branchmodel.cpp | 3 +- src/plugins/git/branchview.cpp | 2 +- src/plugins/git/gitclient.cpp | 8 +- src/plugins/projectexplorer/buildmanager.cpp | 10 +- .../qmakeprojectmanager/qmakemakestep.cpp | 2 +- src/plugins/qmakeprojectmanager/qmakestep.cpp | 2 +- .../qnx/qnxdeployqtlibrariesdialog.cpp | 2 +- .../abstractremotelinuxdeploystep.cpp | 13 +- .../remotelinux/genericdirectuploadstep.cpp | 2 +- src/plugins/remotelinux/linuxdevicetester.cpp | 29 ++- src/plugins/remotelinux/makeinstallstep.cpp | 17 +- tests/auto/solutions/tasking/tst_tasking.cpp | 198 +++++++----------- tests/auto/utils/async/tst_async.cpp | 2 +- tests/manual/tasking/demo/main.cpp | 22 +- tests/manual/tasking/demo/taskwidget.h | 5 +- .../tasking/imagescaling/imagescaling.cpp | 2 +- 27 files changed, 253 insertions(+), 275 deletions(-) diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp index 2faadd22eca..615fbe0eb4c 100644 --- a/src/libs/solutions/tasking/tasktree.cpp +++ b/src/libs/solutions/tasking/tasktree.cpp @@ -707,6 +707,8 @@ private: \sa onGroupDone(), onGroupError() */ +// TODO: Fix docs + /*! \fn template GroupItem onGroupSetup(SetupHandler &&handler) @@ -726,6 +728,8 @@ private: \sa GroupItem::GroupSetupHandler, onGroupDone(), onGroupError() */ +// TODO: Fix docs + /*! Constructs a group's element holding the group done handler. The \a handler is invoked whenever the group finishes with success. @@ -740,10 +744,8 @@ private: \sa GroupItem::GroupEndHandler, onGroupSetup(), onGroupError() */ -GroupItem onGroupDone(const GroupItem::GroupEndHandler &handler) -{ - return Group::onGroupDone(handler); -} + +// TODO: Fix docs /*! Constructs a group's element holding the group error handler. @@ -759,10 +761,6 @@ GroupItem onGroupDone(const GroupItem::GroupEndHandler &handler) \sa GroupItem::GroupEndHandler, onGroupSetup(), onGroupDone() */ -GroupItem onGroupError(const GroupItem::GroupEndHandler &handler) -{ - return Group::onGroupError(handler); -} /*! Constructs a group's element describing the \l{Execution Mode}{execution mode}. @@ -924,12 +922,6 @@ void GroupItem::addChildren(const QList &children) m_groupData.m_groupHandler.m_doneHandler = child.m_groupData.m_groupHandler.m_doneHandler; } - if (child.m_groupData.m_groupHandler.m_errorHandler) { - QTC_ASSERT(!m_groupData.m_groupHandler.m_errorHandler, - qWarning("Group Error Handler redefinition, overriding...")); - m_groupData.m_groupHandler.m_errorHandler - = child.m_groupData.m_groupHandler.m_errorHandler; - } if (child.m_groupData.m_parallelLimit) { QTC_ASSERT(!m_groupData.m_parallelLimit, qWarning("Group Execution Mode redefinition, overriding...")); @@ -954,7 +946,7 @@ void GroupItem::addChildren(const QList &children) } GroupItem GroupItem::withTimeout(const GroupItem &item, milliseconds timeout, - const GroupEndHandler &handler) + const std::function &handler) { const auto onSetup = [timeout](milliseconds &timeoutData) { timeoutData = timeout; }; return Group { @@ -1032,7 +1024,7 @@ public: SetupResult startChildren(int nextChild); SetupResult childDone(bool success); void stop(); - void invokeEndHandler(); + bool invokeDoneHandler(DoneWith result); bool isRunning() const { return m_runtimeData.has_value(); } bool isStarting() const { return isRunning() && m_runtimeData->m_startGuard.isLocked(); } @@ -1329,14 +1321,14 @@ SetupResult TaskContainer::continueStart(SetupResult startAction, int nextChild) : startAction; QTC_CHECK(isRunning()); // TODO: superfluous if (groupAction != SetupResult::Continue) { - const bool success = m_runtimeData->updateSuccessBit(groupAction == SetupResult::StopWithDone); - invokeEndHandler(); + const bool bit = m_runtimeData->updateSuccessBit(groupAction == SetupResult::StopWithDone); + const bool result = invokeDoneHandler(bit ? DoneWith::Success : DoneWith::Error); if (TaskContainer *parentContainer = m_constData.m_parentContainer) { QTC_CHECK(parentContainer->isRunning()); if (!parentContainer->isStarting()) - parentContainer->childDone(success); + parentContainer->childDone(result); } else { - m_constData.m_taskTreePrivate->emitDone(success ? DoneWith::Success : DoneWith::Error); + m_constData.m_taskTreePrivate->emitDone(result ? DoneWith::Success : DoneWith::Error); } } return groupAction; @@ -1406,15 +1398,22 @@ void TaskContainer::stop() m_constData.m_taskTreePrivate->advanceProgress(skippedTaskCount); } -void TaskContainer::invokeEndHandler() +static bool shouldCall(CallDoneIf callDoneIf, DoneWith result) { + if (result == DoneWith::Success) + return callDoneIf != CallDoneIf::Error; + return callDoneIf != CallDoneIf::Success; +} + +bool TaskContainer::invokeDoneHandler(DoneWith result) +{ + bool success = result == DoneWith::Success; const GroupItem::GroupHandler &groupHandler = m_constData.m_groupHandler; - if (m_runtimeData->m_successBit && groupHandler.m_doneHandler) - invokeHandler(this, groupHandler.m_doneHandler); - else if (!m_runtimeData->m_successBit && groupHandler.m_errorHandler) - invokeHandler(this, groupHandler.m_errorHandler); + if (groupHandler.m_doneHandler && shouldCall(groupHandler.m_callDoneIf, result)) + success = invokeHandler(this, groupHandler.m_doneHandler, result); m_runtimeData->callStorageDoneHandlers(); m_runtimeData.reset(); + return success; } SetupResult TaskNode::start() @@ -1457,7 +1456,7 @@ void TaskNode::stop() if (!m_task) { m_container.stop(); m_container.m_runtimeData->updateSuccessBit(false); - m_container.invokeEndHandler(); + m_container.invokeDoneHandler(DoneWith::Cancel); return; } @@ -1467,13 +1466,6 @@ void TaskNode::stop() m_task.reset(); } -static bool shouldCall(CallDoneIf callDoneIf, DoneWith result) -{ - if (result == DoneWith::Success) - return callDoneIf != CallDoneIf::Error; - return callDoneIf != CallDoneIf::Success; -} - bool TaskNode::invokeDoneHandler(DoneWith result) { bool success = result == DoneWith::Success; diff --git a/src/libs/solutions/tasking/tasktree.h b/src/libs/solutions/tasking/tasktree.h index 2483dfea821..deacc7c6167 100644 --- a/src/libs/solutions/tasking/tasktree.h +++ b/src/libs/solutions/tasking/tasktree.h @@ -157,10 +157,10 @@ public: using TaskSetupHandler = std::function; // Called on task done, just before deleteLater using TaskDoneHandler = std::function; - // Called when group entered + // Called when group entered, after group's storages are created using GroupSetupHandler = std::function; - // Called when group done / error - using GroupEndHandler = std::function; + // Called when group done, before group's storages are deleted + using GroupDoneHandler = std::function; struct TaskHandler { TaskCreateHandler m_createHandler; @@ -171,8 +171,8 @@ public: struct GroupHandler { GroupSetupHandler m_setupHandler; - GroupEndHandler m_doneHandler = {}; - GroupEndHandler m_errorHandler = {}; + GroupDoneHandler m_doneHandler = {}; + CallDoneIf m_callDoneIf = CallDoneIf::SuccessOrError; }; struct GroupData { @@ -210,7 +210,7 @@ protected: static GroupItem parallelLimit(int limit) { return GroupItem({{}, limit}); } static GroupItem workflowPolicy(WorkflowPolicy policy) { return GroupItem({{}, {}, policy}); } static GroupItem withTimeout(const GroupItem &item, std::chrono::milliseconds timeout, - const GroupEndHandler &handler = {}); + const std::function &handler = {}); private: Type m_type = Type::Group; @@ -227,32 +227,30 @@ public: Group(std::initializer_list children) { addChildren(children); } // GroupData related: - template - static GroupItem onGroupSetup(SetupHandler &&handler) { - return groupHandler({wrapGroupSetup(std::forward(handler))}); + template + static GroupItem onGroupSetup(Handler &&handler) { + return groupHandler({wrapGroupSetup(std::forward(handler))}); } - static GroupItem onGroupDone(const GroupEndHandler &handler) { - return groupHandler({{}, handler}); - } - static GroupItem onGroupError(const GroupEndHandler &handler) { - return groupHandler({{}, {}, handler}); + template + static GroupItem onGroupDone(Handler &&handler, CallDoneIf callDoneIf = CallDoneIf::SuccessOrError) { + return groupHandler({{}, wrapGroupDone(std::forward(handler)), callDoneIf}); } using GroupItem::parallelLimit; // Default: 1 (sequential). 0 means unlimited (parallel). using GroupItem::workflowPolicy; // Default: WorkflowPolicy::StopOnError. GroupItem withTimeout(std::chrono::milliseconds timeout, - const GroupEndHandler &handler = {}) const { + const std::function &handler = {}) const { return GroupItem::withTimeout(*this, timeout, handler); } private: - template - static GroupSetupHandler wrapGroupSetup(SetupHandler &&handler) + template + static GroupSetupHandler wrapGroupSetup(Handler &&handler) { static constexpr bool isDynamic - = std::is_same_v>>; + = std::is_same_v>>; constexpr bool isVoid - = std::is_same_v>>; + = std::is_same_v>>; static_assert(isDynamic || isVoid, "Group setup handler needs to take no arguments and has to return " "void or SetupResult. The passed handler doesn't fulfill these requirements."); @@ -263,16 +261,49 @@ private: return SetupResult::Continue; }; }; + template + static GroupDoneHandler wrapGroupDone(Handler &&handler) + { + static constexpr bool isBD // stands for [B]ool, [D]oneWith + = std::is_invocable_r_v, DoneWith>; + static constexpr bool isB + = std::is_invocable_r_v>; + static constexpr bool isVD // stands for [V]oid, [D]oneWith + = std::is_invocable_r_v, DoneWith>; + static constexpr bool isV + = std::is_invocable_r_v>; + static constexpr bool isInvocable = isBD || isB || isVD || isV; + + static_assert(isInvocable, + "Group done handler needs to take (DoneWith) or (void) " + "as arguments and has to return void or bool. " + "The passed handler doesn't fulfill these requirements."); + return [=](DoneWith result) { + if constexpr (isBD) + return std::invoke(handler, result); + if constexpr (isB) + return std::invoke(handler); + if constexpr (isVD) + std::invoke(handler, result); + else if constexpr (isV) + std::invoke(handler); + return result == DoneWith::Success; + }; + }; }; -template -static GroupItem onGroupSetup(SetupHandler &&handler) +template +static GroupItem onGroupSetup(Handler &&handler) { - return Group::onGroupSetup(std::forward(handler)); + return Group::onGroupSetup(std::forward(handler)); +} + +template +static GroupItem onGroupDone(Handler &&handler, CallDoneIf callDoneIf = CallDoneIf::SuccessOrError) +{ + return Group::onGroupDone(std::forward(handler), callDoneIf); } -TASKING_EXPORT GroupItem onGroupDone(const GroupItem::GroupEndHandler &handler); -TASKING_EXPORT GroupItem onGroupError(const GroupItem::GroupEndHandler &handler); TASKING_EXPORT GroupItem parallelLimit(int limit); TASKING_EXPORT GroupItem workflowPolicy(WorkflowPolicy policy); @@ -354,7 +385,8 @@ public: {} GroupItem withTimeout(std::chrono::milliseconds timeout, - const GroupEndHandler &handler = {}) const { + const std::function &handler = {}) const + { return GroupItem::withTimeout(*this, timeout, handler); } diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 3e840715499..1e8dfbc3fb0 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -834,7 +834,7 @@ Tasking::GroupItem AndroidBuildApkStep::runRecipe() const Group root { onGroupSetup(onSetup), - onGroupDone(onDone), + onGroupDone(onDone, CallDoneIf::Success), defaultProcessTask() }; return root; diff --git a/src/plugins/autotoolsprojectmanager/autogenstep.cpp b/src/plugins/autotoolsprojectmanager/autogenstep.cpp index ec54184478b..2c44a6bfeed 100644 --- a/src/plugins/autotoolsprojectmanager/autogenstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autogenstep.cpp @@ -94,9 +94,12 @@ Tasking::GroupItem AutogenStep::runRecipe() } return SetupResult::Continue; }; - const auto onDone = [this] { m_runAutogen = false; }; - return Group { onGroupSetup(onSetup), onGroupDone(onDone), defaultProcessTask() }; + return Group { + onGroupSetup(onSetup), + onGroupDone([this] { m_runAutogen = false; }, CallDoneIf::Success), + defaultProcessTask() + }; } // AutogenStepFactory diff --git a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp index 9dea7d6f7fb..bea7767bf57 100644 --- a/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp +++ b/src/plugins/autotoolsprojectmanager/autoreconfstep.cpp @@ -79,9 +79,12 @@ private: } return SetupResult::Continue; }; - const auto onDone = [this] { m_runAutoreconf = false; }; - return Group { onGroupSetup(onSetup), onGroupDone(onDone), defaultProcessTask() }; + return Group { + onGroupSetup(onSetup), + onGroupDone([this] { m_runAutoreconf = false; }, CallDoneIf::Success), + defaultProcessTask() + }; } bool m_runAutoreconf = false; diff --git a/src/plugins/autotoolsprojectmanager/configurestep.cpp b/src/plugins/autotoolsprojectmanager/configurestep.cpp index 14c7a3eefa6..fe4f5a10f5d 100644 --- a/src/plugins/autotoolsprojectmanager/configurestep.cpp +++ b/src/plugins/autotoolsprojectmanager/configurestep.cpp @@ -98,9 +98,12 @@ Tasking::GroupItem ConfigureStep::runRecipe() } return SetupResult::Continue; }; - const auto onDone = [this] { m_runConfigure = false; }; - return Group { onGroupSetup(onSetup), onGroupDone(onDone), defaultProcessTask() }; + return Group { + onGroupSetup(onSetup), + onGroupDone([this] { m_runConfigure = false; }, CallDoneIf::Success), + defaultProcessTask() + }; } // ConfigureStepFactory diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index 6de133a6a36..4083e411614 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -369,15 +369,11 @@ GroupItem CMakeBuildStep::runRecipe() emit addOutput(Tr::tr("Project did not parse successfully, cannot build."), OutputFormat::ErrorMessage); }; - const auto onEnd = [this] { - updateDeploymentData(); - }; Group root { ignoreReturnValue() ? finishAllAndDone : stopOnError, ProjectParserTask(onParserSetup, onParserError, CallDoneIf::Error), defaultProcessTask(), - onGroupDone(onEnd), - onGroupError(onEnd) + onGroupDone([this] { updateDeploymentData(); }) }; return root; } diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.cpp b/src/plugins/coreplugin/locator/ilocatorfilter.cpp index 30240a40ea2..923d9659846 100644 --- a/src/plugins/coreplugin/locator/ilocatorfilter.cpp +++ b/src/plugins/coreplugin/locator/ilocatorfilter.cpp @@ -457,10 +457,6 @@ void LocatorMatcher::start() }; }; - const auto onDone = [](const TreeStorage &storage) { - return [storage] { storage->finalize(); }; - }; - int index = 0; for (const LocatorMatcherTask &task : std::as_const(d->m_tasks)) { const auto storage = task.storage; @@ -468,8 +464,7 @@ void LocatorMatcher::start() finishAllAndDone, Storage(storage), onGroupSetup(onSetup(storage, index)), - onGroupDone(onDone(storage)), - onGroupError(onDone(storage)), + onGroupDone([storage] { storage->finalize(); }), task.task }; parallelTasks << group; diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index 3dea793bb3d..306b0df3016 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -390,7 +390,7 @@ void Locator::refresh(const QList &filters) const Group group { finishAllAndDone, *task, - onGroupDone([this, filter] { m_refreshingFilters.removeOne(filter); }) + onGroupDone([this, filter] { m_refreshingFilters.removeOne(filter); }, CallDoneIf::Success) }; tasks.append(group); } diff --git a/src/plugins/cppeditor/cppprojectupdater.cpp b/src/plugins/cppeditor/cppprojectupdater.cpp index 1413c5132f2..7f269ac2e2f 100644 --- a/src/plugins/cppeditor/cppprojectupdater.cpp +++ b/src/plugins/cppeditor/cppprojectupdater.cpp @@ -68,7 +68,10 @@ void CppProjectUpdater::update(const ProjectUpdateInfo &projectUpdateInfo, tasks.append(compiler->compileFileItem()); } - const auto onDone = [this, storage, compilers] { + const auto onDone = [this, storage, compilers](DoneWith result) { + m_taskTree.release()->deleteLater(); + if (result != DoneWith::Success) + return; QList extraCompilers; QSet compilerFiles; for (const QPointer &compiler : compilers) { @@ -80,17 +83,12 @@ void CppProjectUpdater::update(const ProjectUpdateInfo &projectUpdateInfo, GeneratedCodeModelSupport::update(extraCompilers); auto updateFuture = CppModelManager::updateProjectInfo(storage->projectInfo, compilerFiles); m_futureSynchronizer.addFuture(updateFuture); - m_taskTree.release()->deleteLater(); - }; - const auto onError = [this] { - m_taskTree.release()->deleteLater(); }; const Group root { Tasking::Storage(storage), Group(tasks), - onGroupDone(onDone), - onGroupError(onError) + onGroupDone(onDone) }; m_taskTree.reset(new TaskTree(root)); auto progress = new Core::TaskProgress(m_taskTree.get()); diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 2210f15ca8b..9deebb7f9cb 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -132,24 +132,21 @@ DiffFilesController::DiffFilesController(IDocument *document) } taskTree.setRecipe(tasks); }; - const auto onTreeDone = [this, storage] { - const QList> &results = *storage; + const auto onTreeDone = [this, storage](DoneWith result) { QList finalList; - for (const std::optional &result : results) { - if (result.has_value()) - finalList.append(*result); + if (result == DoneWith::Success) { + const QList> &results = *storage; + for (const std::optional &result : results) { + if (result.has_value()) + finalList.append(*result); + } } setDiffFiles(finalList); }; - const auto onTreeError = [this, storage] { - setDiffFiles({}); - }; const Group root = { Storage(storage), - TaskTreeTask(onTreeSetup), - onGroupDone(onTreeDone), - onGroupError(onTreeError) + TaskTreeTask(onTreeSetup, onTreeDone) }; setReloadRecipe(root); } diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index 421624bb5e6..91d74f50b93 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -468,8 +468,7 @@ void BranchModel::refresh(const FilePath &workingDirectory, ShowError showError) const Group root { topRevisionProc, ProcessTask(onForEachRefSetup, onForEachRefDone), - onGroupDone(finalize), - onGroupError(finalize) + onGroupDone(finalize) }; d->refreshTask.reset(new TaskTree(root)); d->refreshTask->start(); diff --git a/src/plugins/git/branchview.cpp b/src/plugins/git/branchview.cpp index 988e148a3f2..960890c2dea 100644 --- a/src/plugins/git/branchview.cpp +++ b/src/plugins/git/branchview.cpp @@ -568,7 +568,7 @@ TaskTree *BranchView::onFastForwardMerge(const std::function &callback) onGroupDone([storage, callback] { if (storage->mergeBase == storage->topRevision) callback(); - }) + }, CallDoneIf::Success) }; auto taskTree = new TaskTree(root); taskTree->start(); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 9b0d3dad168..79c165bb462 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -340,7 +340,7 @@ FileListDiffController::FileListDiffController(IDocument *document, const QStrin continueOnDone, ProcessTask(onStagedSetup, onStagedDone, CallDoneIf::Success), ProcessTask(onUnstagedSetup, onUnstagedDone, CallDoneIf::Success), - onGroupDone(onDone) + onGroupDone(onDone, CallDoneIf::Success) }, postProcessTask(diffInputStorage) }; @@ -498,7 +498,11 @@ ShowController::ShowController(IDocument *document, const QString &id) updateDescription(*data); }; - QList tasks { parallel, continueOnDone, onGroupError(onFollowsError) }; + QList tasks { + parallel, + continueOnDone, + onGroupDone(onFollowsError, CallDoneIf::Error) + }; for (int i = 0, total = parents.size(); i < total; ++i) { const auto onFollowSetup = [this, parent = parents.at(i)](Process &process) { setupCommand(process, {"describe", "--tags", "--abbrev=0", parent}); diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index b3b04a364ff..46d90d14e80 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -648,15 +648,14 @@ void BuildManager::startBuildQueue() if (d->m_futureProgress) d->m_futureProgress.data()->setTitle(name); }; - const auto onRecipeDone = [buildStep] { + const auto onRecipeDone = [buildStep, target](DoneWith result) { disconnect(buildStep, &BuildStep::progress, instance(), nullptr); d->m_outputWindow->flush(); ++d->m_progress; d->m_progressFutureInterface->setProgressValueAndText( 100 * d->m_progress, msgProgress(d->m_progress, d->m_maxProgress)); - }; - const auto onRecipeError = [buildStep, target, onRecipeDone] { - onRecipeDone(); + if (result == DoneWith::Success) + return; const QString projectName = buildStep->project()->displayName(); const QString targetName = target->displayName(); addToOutputWindow(Tr::tr("Error while building/deploying project %1 (kit: %2)") @@ -673,8 +672,7 @@ void BuildManager::startBuildQueue() const Group recipeGroup { onGroupSetup(onRecipeSetup), buildStep->runRecipe(), - onGroupDone(onRecipeDone), - onGroupError(onRecipeError), + onGroupDone(onRecipeDone) }; targetTasks.append(recipeGroup); } diff --git a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp index 617c0d63e80..8340aac70a9 100644 --- a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp @@ -229,7 +229,7 @@ Tasking::GroupItem QmakeMakeStep::runRecipe() return Group { ignoreReturnValue() ? finishAllAndDone : stopOnError, onGroupSetup(onSetup), - onGroupError(onError), + onGroupDone(onError, CallDoneIf::Error), defaultProcessTask() }; } diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index c95416ebd04..2225ea5da80 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -299,7 +299,7 @@ Tasking::GroupItem QMakeStep::runRecipe() }; QList processList = {onGroupSetup(onSetup), - onGroupDone(onDone), + onGroupDone(onDone, CallDoneIf::Success), ProcessTask(onQMakeSetup, onProcessDone)}; if (m_runMakeQmake) processList << ProcessTask(onMakeQMakeSetup, onProcessDone); diff --git a/src/plugins/qnx/qnxdeployqtlibrariesdialog.cpp b/src/plugins/qnx/qnxdeployqtlibrariesdialog.cpp index 10976ad1d50..1cf995c82fd 100644 --- a/src/plugins/qnx/qnxdeployqtlibrariesdialog.cpp +++ b/src/plugins/qnx/qnxdeployqtlibrariesdialog.cpp @@ -272,7 +272,7 @@ Group QnxDeployQtLibrariesDialogPrivate::deployRecipe() uploadTask(), chmodTree() }, - onGroupDone(doneHandler) + onGroupDone(doneHandler, CallDoneIf::Success) }; return root; } diff --git a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp index 4540deea51d..27ac24232d8 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp @@ -148,17 +148,16 @@ GroupItem AbstractRemoteLinuxDeployStep::runRecipe() } return SetupResult::Continue; }; - const auto onDone = [this] { - emit addOutput(Tr::tr("Deploy step finished."), OutputFormat::NormalMessage); - }; - const auto onError = [this] { - emit addOutput(Tr::tr("Deploy step failed."), OutputFormat::ErrorMessage); + const auto onDone = [this](DoneWith result) { + if (result == DoneWith::Success) + emit addOutput(Tr::tr("Deploy step finished."), OutputFormat::NormalMessage); + else + emit addOutput(Tr::tr("Deploy step failed."), OutputFormat::ErrorMessage); }; return Group { onGroupSetup(onSetup), deployRecipe(), - onGroupDone(onDone), - onGroupError(onError) + onGroupDone(onDone) }; } diff --git a/src/plugins/remotelinux/genericdirectuploadstep.cpp b/src/plugins/remotelinux/genericdirectuploadstep.cpp index a1d11de47ab..65798386991 100644 --- a/src/plugins/remotelinux/genericdirectuploadstep.cpp +++ b/src/plugins/remotelinux/genericdirectuploadstep.cpp @@ -297,7 +297,7 @@ GroupItem GenericDirectUploadStep::deployRecipe() uploadTask(storage), chmodTree(storage), statTree(storage, postFilesToStat, postStatEndHandler), - onGroupDone(doneHandler) + onGroupDone(doneHandler, CallDoneIf::Success) }; return root; } diff --git a/src/plugins/remotelinux/linuxdevicetester.cpp b/src/plugins/remotelinux/linuxdevicetester.cpp index 7dcbedbd96f..3a08c092b9c 100644 --- a/src/plugins/remotelinux/linuxdevicetester.cpp +++ b/src/plugins/remotelinux/linuxdevicetester.cpp @@ -227,16 +227,17 @@ GroupItem GenericLinuxDeviceTesterPrivate::transferTask(FileTransferMethod metho GroupItem GenericLinuxDeviceTesterPrivate::transferTasks() const { TreeStorage storage; - return Group{continueOnDone, - Tasking::Storage(storage), - transferTask(FileTransferMethod::GenericCopy, storage), - transferTask(FileTransferMethod::Sftp, storage), - transferTask(FileTransferMethod::Rsync, storage), - onGroupError([this] { - emit q->errorMessage(Tr::tr("Deployment to this device will not " - "work out of the box.") - + "\n"); - })}; + return Group { + continueOnDone, + Tasking::Storage(storage), + transferTask(FileTransferMethod::GenericCopy, storage), + transferTask(FileTransferMethod::Sftp, storage), + transferTask(FileTransferMethod::Rsync, storage), + onGroupDone([this] { + emit q->errorMessage(Tr::tr("Deployment to this device will not work out of the box.") + + "\n"); + }, CallDoneIf::Error) + }; } GroupItem GenericLinuxDeviceTesterPrivate::commandTask(const QString &commandName) const @@ -299,8 +300,8 @@ void GenericLinuxDeviceTester::testDevice(const IDevice::Ptr &deviceConfiguratio d->m_device = deviceConfiguration; - auto allFinished = [this](DeviceTester::TestResult testResult) { - emit finished(testResult); + auto onDone = [this](DoneWith result) { + emit finished(result == DoneWith::Success ? TestSuccess : TestFailure); d->m_taskTree.release()->deleteLater(); }; @@ -313,9 +314,7 @@ void GenericLinuxDeviceTester::testDevice(const IDevice::Ptr &deviceConfiguratio }; if (!d->m_extraTests.isEmpty()) taskItems << Group { d->m_extraTests }; - taskItems << d->commandTasks() - << onGroupDone(std::bind(allFinished, TestSuccess)) - << onGroupError(std::bind(allFinished, TestFailure)); + taskItems << d->commandTasks() << onGroupDone(onDone); d->m_taskTree.reset(new TaskTree(taskItems)); d->m_taskTree->start(); diff --git a/src/plugins/remotelinux/makeinstallstep.cpp b/src/plugins/remotelinux/makeinstallstep.cpp index a061bc4215a..08e65e61261 100644 --- a/src/plugins/remotelinux/makeinstallstep.cpp +++ b/src/plugins/remotelinux/makeinstallstep.cpp @@ -192,7 +192,14 @@ Tasking::GroupItem MakeInstallStep::runRecipe() { using namespace Tasking; - const auto onDone = [this] { + const auto onDone = [this](DoneWith result) { + if (result != DoneWith::Success) { + if (m_noInstallTarget && m_isCmakeProject) { + emit addTask(DeploymentTask(Task::Warning, Tr::tr("You need to add an install " + "statement to your CMakeLists.txt file for deployment to work."))); + } + return; + } const FilePath rootDir = makeCommand().withNewPath(m_installRoot().path()); // FIXME: Needed? m_deploymentData = DeploymentData(); @@ -215,14 +222,8 @@ Tasking::GroupItem MakeInstallStep::runRecipe() buildSystem()->setDeploymentData(m_deploymentData); }; - const auto onError = [this] { - if (m_noInstallTarget && m_isCmakeProject) { - emit addTask(DeploymentTask(Task::Warning, Tr::tr("You need to add an install " - "statement to your CMakeLists.txt file for deployment to work."))); - } - }; - return Group { onGroupDone(onDone), onGroupError(onError), defaultProcessTask() }; + return Group { onGroupDone(onDone), defaultProcessTask() }; } void MakeInstallStep::updateCommandFromAspect() diff --git a/tests/auto/solutions/tasking/tst_tasking.cpp b/tests/auto/solutions/tasking/tst_tasking.cpp index cf315f84a98..03be490df8f 100644 --- a/tests/auto/solutions/tasking/tst_tasking.cpp +++ b/tests/auto/solutions/tasking/tst_tasking.cpp @@ -24,7 +24,7 @@ enum class Handler { Canceled, GroupSetup, GroupSuccess, - GroupError, + GroupError, // TODO: Add GroupCanceled Sync, BarrierAdvance, Timeout @@ -116,8 +116,7 @@ void tst_Tasking::validConstructs() } }, task, - onGroupDone([] {}), - onGroupError([] {}) + onGroupDone([] {}) }; const auto setupHandler = [](TaskObject &) {}; @@ -213,6 +212,11 @@ GroupItem createBarrierAdvance(const TreeStorage &storage, }); } +static Handler resultToGroupHandler(DoneWith result) +{ + return result == DoneWith::Success ? Handler::GroupSuccess : Handler::GroupError; +} + void tst_Tasking::testTree_data() { QTest::addColumn("testData"); @@ -267,13 +271,14 @@ void tst_Tasking::testTree_data() }; const auto groupSetup = [storage](int taskId) { - return onGroupSetup([=] { storage->m_log.append({taskId, Handler::GroupSetup}); }); + return onGroupSetup([storage, taskId] { + storage->m_log.append({taskId, Handler::GroupSetup}); + }); }; const auto groupDone = [storage](int taskId) { - return onGroupDone([=] { storage->m_log.append({taskId, Handler::GroupSuccess}); }); - }; - const auto groupError = [storage](int taskId) { - return onGroupError([=] { storage->m_log.append({taskId, Handler::GroupError}); }); + return onGroupDone([storage, taskId](DoneWith result) { + storage->m_log.append({taskId, resultToGroupHandler(result)}); + }); }; const auto createSync = [storage](int taskId) { return Sync([=] { storage->m_log.append({taskId, Handler::Sync}); }); @@ -285,26 +290,22 @@ void tst_Tasking::testTree_data() { const Group root1 { Storage(storage), - groupDone(0), - groupError(0) + groupDone(0) }; const Group root2 { Storage(storage), onGroupSetup([] { return SetupResult::Continue; }), - groupDone(0), - groupError(0) + groupDone(0) }; const Group root3 { Storage(storage), onGroupSetup([] { return SetupResult::StopWithDone; }), - groupDone(0), - groupError(0) + groupDone(0) }; const Group root4 { Storage(storage), onGroupSetup([] { return SetupResult::StopWithError; }), - groupDone(0), - groupError(0) + groupDone(0) }; const Log logDone {{0, Handler::GroupSuccess}}; @@ -322,8 +323,7 @@ void tst_Tasking::testTree_data() Storage(storage), workflowPolicy(policy), onGroupSetup([setupResult] { return setupResult; }), - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -641,8 +641,7 @@ void tst_Tasking::testTree_data() createFailingTask(3), createSuccessTask(4), createSuccessTask(5), - groupDone(0), - groupError(0) + groupDone(0) }; const Log log { {1, Handler::Setup}, @@ -657,12 +656,11 @@ void tst_Tasking::testTree_data() } { - const auto createRoot = [storage, groupDone, groupError](WorkflowPolicy policy) { + const auto createRoot = [storage, groupDone](WorkflowPolicy policy) { return Group { Storage(storage), workflowPolicy(policy), - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -699,14 +697,13 @@ void tst_Tasking::testTree_data() } { - const auto createRoot = [storage, createSuccessTask, groupDone, groupError]( + const auto createRoot = [storage, createSuccessTask, groupDone]( WorkflowPolicy policy) { return Group { Storage(storage), workflowPolicy(policy), createSuccessTask(1), - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -752,14 +749,13 @@ void tst_Tasking::testTree_data() } { - const auto createRoot = [storage, createFailingTask, groupDone, groupError]( + const auto createRoot = [storage, createFailingTask, groupDone]( WorkflowPolicy policy) { return Group { Storage(storage), workflowPolicy(policy), createFailingTask(1), - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -808,16 +804,15 @@ void tst_Tasking::testTree_data() // These tests check whether the proper root's group end handler is called // when the group is stopped. Test it with different workflow policies. // The root starts one short failing task together with one long task. - const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone, - groupError](WorkflowPolicy policy) { + const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone]( + WorkflowPolicy policy) { return Group { Storage(storage), parallel, workflowPolicy(policy), createFailingTask(1, 1ms), createSuccessTask(2, 1ms), - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -879,8 +874,8 @@ void tst_Tasking::testTree_data() // when the group is stopped. Test it with different workflow policies. // The root starts in parallel: one very short successful task, one short failing task // and one long task. - const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone, - groupError](WorkflowPolicy policy) { + const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone]( + WorkflowPolicy policy) { return Group { Storage(storage), parallel, @@ -888,8 +883,7 @@ void tst_Tasking::testTree_data() createSuccessTask(1), createFailingTask(2, 1ms), createSuccessTask(3, 1ms), - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -966,24 +960,22 @@ void tst_Tasking::testTree_data() // These tests check whether the proper subgroup's end handler is called // when the group is stopped. Test it with different workflow policies. // The subgroup starts one long task. - const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone, - groupError](WorkflowPolicy policy) { + const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone]( + WorkflowPolicy policy) { return Group { Storage(storage), parallel, Group { workflowPolicy(policy), createSuccessTask(1, 1000ms), - groupDone(1), - groupError(1) + groupDone(1) }, createFailingTask(2, 1ms), - groupDone(2), - groupError(2) + groupDone(2) }; }; - const Log errorLog = { + const Log log = { {1, Handler::Setup}, {2, Handler::Setup}, {2, Handler::Error}, @@ -992,50 +984,43 @@ void tst_Tasking::testTree_data() {2, Handler::GroupError} }; - const Log doneLog = { - {1, Handler::Setup}, - {2, Handler::Setup}, - {2, Handler::Error}, - {1, Handler::Canceled}, - {1, Handler::GroupSuccess}, - {2, Handler::GroupError} - }; - const Group root1 = createRoot(WorkflowPolicy::StopOnError); QTest::newRow("StopGroupWithStopOnError") - << TestData{storage, root1, errorLog, 2, OnDone::Failure}; + << TestData{storage, root1, log, 2, OnDone::Failure}; const Group root2 = createRoot(WorkflowPolicy::ContinueOnError); QTest::newRow("StopGroupWithContinueOnError") - << TestData{storage, root2, errorLog, 2, OnDone::Failure}; + << TestData{storage, root2, log, 2, OnDone::Failure}; const Group root3 = createRoot(WorkflowPolicy::StopOnDone); QTest::newRow("StopGroupWithStopOnDone") - << TestData{storage, root3, errorLog, 2, OnDone::Failure}; + << TestData{storage, root3, log, 2, OnDone::Failure}; const Group root4 = createRoot(WorkflowPolicy::ContinueOnDone); QTest::newRow("StopGroupWithContinueOnDone") - << TestData{storage, root4, errorLog, 2, OnDone::Failure}; + << TestData{storage, root4, log, 2, OnDone::Failure}; const Group root5 = createRoot(WorkflowPolicy::StopOnFinished); QTest::newRow("StopGroupWithStopOnFinished") - << TestData{storage, root5, errorLog, 2, OnDone::Failure}; + << TestData{storage, root5, log, 2, OnDone::Failure}; + // TODO: Behavioral change! Fix Docs! + // Cancellation always invokes error handler (i.e. DoneWith is Cancel) const Group root6 = createRoot(WorkflowPolicy::FinishAllAndDone); QTest::newRow("StopGroupWithFinishAllAndDone") - << TestData{storage, root6, doneLog, 2, OnDone::Failure}; + << TestData{storage, root6, log, 2, OnDone::Failure}; const Group root7 = createRoot(WorkflowPolicy::FinishAllAndError); QTest::newRow("StopGroupWithFinishAllAndError") - << TestData{storage, root7, errorLog, 2, OnDone::Failure}; + << TestData{storage, root7, log, 2, OnDone::Failure}; } { // These tests check whether the proper subgroup's end handler is called // when the group is stopped. Test it with different workflow policies. // The sequential subgroup starts one short successful task followed by one long task. - const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone, - groupError](WorkflowPolicy policy) { + const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone]( + WorkflowPolicy policy) { return Group { Storage(storage), parallel, @@ -1043,12 +1028,10 @@ void tst_Tasking::testTree_data() workflowPolicy(policy), createSuccessTask(1), createSuccessTask(2, 1000ms), - groupDone(1), - groupError(1) + groupDone(1) }, createFailingTask(3, 1ms), - groupDone(2), - groupError(2) + groupDone(2) }; }; @@ -1063,7 +1046,7 @@ void tst_Tasking::testTree_data() {2, Handler::GroupError} }; - const Log shortDoneLog = { + const Log doneLog = { {1, Handler::Setup}, {3, Handler::Setup}, {1, Handler::Success}, @@ -1072,17 +1055,6 @@ void tst_Tasking::testTree_data() {2, Handler::GroupError} }; - const Log longDoneLog = { - {1, Handler::Setup}, - {3, Handler::Setup}, - {1, Handler::Success}, - {2, Handler::Setup}, - {3, Handler::Error}, - {2, Handler::Canceled}, - {1, Handler::GroupSuccess}, - {2, Handler::GroupError} - }; - const Group root1 = createRoot(WorkflowPolicy::StopOnError); QTest::newRow("StopGroupAfterDoneWithStopOnError") << TestData{storage, root1, errorLog, 3, OnDone::Failure}; @@ -1093,19 +1065,21 @@ void tst_Tasking::testTree_data() const Group root3 = createRoot(WorkflowPolicy::StopOnDone); QTest::newRow("StopGroupAfterDoneWithStopOnDone") - << TestData{storage, root3, shortDoneLog, 3, OnDone::Failure}; + << TestData{storage, root3, doneLog, 3, OnDone::Failure}; + // TODO: Behavioral change! const Group root4 = createRoot(WorkflowPolicy::ContinueOnDone); QTest::newRow("StopGroupAfterDoneWithContinueOnDone") - << TestData{storage, root4, longDoneLog, 3, OnDone::Failure}; + << TestData{storage, root4, errorLog, 3, OnDone::Failure}; const Group root5 = createRoot(WorkflowPolicy::StopOnFinished); QTest::newRow("StopGroupAfterDoneWithStopOnFinished") - << TestData{storage, root5, shortDoneLog, 3, OnDone::Failure}; + << TestData{storage, root5, doneLog, 3, OnDone::Failure}; + // TODO: Behavioral change! const Group root6 = createRoot(WorkflowPolicy::FinishAllAndDone); QTest::newRow("StopGroupAfterDoneWithFinishAllAndDone") - << TestData{storage, root6, longDoneLog, 3, OnDone::Failure}; + << TestData{storage, root6, errorLog, 3, OnDone::Failure}; const Group root7 = createRoot(WorkflowPolicy::FinishAllAndError); QTest::newRow("StopGroupAfterDoneWithFinishAllAndError") @@ -1116,8 +1090,8 @@ void tst_Tasking::testTree_data() // These tests check whether the proper subgroup's end handler is called // when the group is stopped. Test it with different workflow policies. // The sequential subgroup starts one short failing task followed by one long task. - const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone, - groupError](WorkflowPolicy policy) { + const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone]( + WorkflowPolicy policy) { return Group { Storage(storage), parallel, @@ -1125,16 +1099,14 @@ void tst_Tasking::testTree_data() workflowPolicy(policy), createFailingTask(1), createSuccessTask(2, 1000ms), - groupDone(1), - groupError(1) + groupDone(1) }, createFailingTask(3, 1ms), - groupDone(2), - groupError(2) + groupDone(2) }; }; - const Log shortErrorLog = { + const Log shortLog = { {1, Handler::Setup}, {3, Handler::Setup}, {1, Handler::Error}, @@ -1143,7 +1115,7 @@ void tst_Tasking::testTree_data() {2, Handler::GroupError} }; - const Log longErrorLog = { + const Log longLog = { {1, Handler::Setup}, {3, Handler::Setup}, {1, Handler::Error}, @@ -1154,57 +1126,46 @@ void tst_Tasking::testTree_data() {2, Handler::GroupError} }; - const Log doneLog = { - {1, Handler::Setup}, - {3, Handler::Setup}, - {1, Handler::Error}, - {2, Handler::Setup}, - {3, Handler::Error}, - {2, Handler::Canceled}, - {1, Handler::GroupSuccess}, - {2, Handler::GroupError} - }; - const Group root1 = createRoot(WorkflowPolicy::StopOnError); QTest::newRow("StopGroupAfterErrorWithStopOnError") - << TestData{storage, root1, shortErrorLog, 3, OnDone::Failure}; + << TestData{storage, root1, shortLog, 3, OnDone::Failure}; const Group root2 = createRoot(WorkflowPolicy::ContinueOnError); QTest::newRow("StopGroupAfterErrorWithContinueOnError") - << TestData{storage, root2, longErrorLog, 3, OnDone::Failure}; + << TestData{storage, root2, longLog, 3, OnDone::Failure}; const Group root3 = createRoot(WorkflowPolicy::StopOnDone); QTest::newRow("StopGroupAfterErrorWithStopOnDone") - << TestData{storage, root3, longErrorLog, 3, OnDone::Failure}; + << TestData{storage, root3, longLog, 3, OnDone::Failure}; const Group root4 = createRoot(WorkflowPolicy::ContinueOnDone); QTest::newRow("StopGroupAfterErrorWithContinueOnDone") - << TestData{storage, root4, longErrorLog, 3, OnDone::Failure}; + << TestData{storage, root4, longLog, 3, OnDone::Failure}; const Group root5 = createRoot(WorkflowPolicy::StopOnFinished); QTest::newRow("StopGroupAfterErrorWithStopOnFinished") - << TestData{storage, root5, shortErrorLog, 3, OnDone::Failure}; + << TestData{storage, root5, shortLog, 3, OnDone::Failure}; + // TODO: Behavioral change! const Group root6 = createRoot(WorkflowPolicy::FinishAllAndDone); QTest::newRow("StopGroupAfterErrorWithFinishAllAndDone") - << TestData{storage, root6, doneLog, 3, OnDone::Failure}; + << TestData{storage, root6, longLog, 3, OnDone::Failure}; const Group root7 = createRoot(WorkflowPolicy::FinishAllAndError); QTest::newRow("StopGroupAfterErrorWithFinishAllAndError") - << TestData{storage, root7, longErrorLog, 3, OnDone::Failure}; + << TestData{storage, root7, longLog, 3, OnDone::Failure}; } { - const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone, - groupError](WorkflowPolicy policy) { + const auto createRoot = [storage, createSuccessTask, createFailingTask, groupDone]( + WorkflowPolicy policy) { return Group { Storage(storage), workflowPolicy(policy), createSuccessTask(1), createFailingTask(2), createSuccessTask(3), - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -1266,7 +1227,7 @@ void tst_Tasking::testTree_data() } { - const auto createRoot = [storage, createTask, groupDone, groupError]( + const auto createRoot = [storage, createTask, groupDone]( bool firstSuccess, bool secondSuccess) { return Group { parallel, @@ -1274,8 +1235,7 @@ void tst_Tasking::testTree_data() Storage(storage), createTask(1, firstSuccess, 1000ms), createTask(2, secondSuccess, 1ms), - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -1306,8 +1266,7 @@ void tst_Tasking::testTree_data() } { - const auto createRoot = [storage, createSuccessTask, groupDone, groupError]( - SetupResult setupResult) { + const auto createRoot = [storage, createSuccessTask, groupDone](SetupResult setupResult) { return Group { Storage(storage), Group { @@ -1319,8 +1278,7 @@ void tst_Tasking::testTree_data() createSuccessTask(3), createSuccessTask(4) }, - groupDone(0), - groupError(0) + groupDone(0) }; }; @@ -1809,7 +1767,7 @@ void tst_Tasking::testTree_data() createSyncWithReturn(3, false), createSuccessTask(4), createSync(5), - groupError(0) + groupDone(0) }; const Log log { {1, Handler::Sync}, diff --git a/tests/auto/utils/async/tst_async.cpp b/tests/auto/utils/async/tst_async.cpp index b891a3106e1..82e1abf730d 100644 --- a/tests/auto/utils/async/tst_async.cpp +++ b/tests/auto/utils/async/tst_async.cpp @@ -511,7 +511,7 @@ void tst_Async::mapReduce_data() AsyncTask(std::bind(setupHandler, _1, 3), handleAsync, CallDoneIf::Success), AsyncTask(std::bind(setupHandler, _1, 4), handleAsync, CallDoneIf::Success), AsyncTask(std::bind(setupHandler, _1, 5), handleAsync, CallDoneIf::Success), - onGroupDone(doneHandler) + onGroupDone(doneHandler, CallDoneIf::Success) }; }; diff --git a/tests/manual/tasking/demo/main.cpp b/tests/manual/tasking/demo/main.cpp index c48b894580f..51c1c3d9554 100644 --- a/tests/manual/tasking/demo/main.cpp +++ b/tests/manual/tasking/demo/main.cpp @@ -25,7 +25,7 @@ static QWidget *hr() return frame; } -QWidget *taskGroup(QWidget *groupWidget, const QList &widgets) +static QWidget *taskGroup(QWidget *groupWidget, const QList &widgets) { QWidget *widget = new QWidget; QBoxLayout *layout = new QHBoxLayout(widget); @@ -42,6 +42,11 @@ QWidget *taskGroup(QWidget *groupWidget, const QList &widgets) return widget; } +static State resultToState(DoneWith result) +{ + return result == DoneWith::Success ? State::Done : State::Error; +} + int main(int argc, char *argv[]) { QApplication app(argc, argv); @@ -172,8 +177,7 @@ int main(int argc, char *argv[]) const Group root { widget->isSuccess() ? stopOnError : finishAllAndError, TimeoutTask(setupTask), - onGroupDone([widget] { widget->setState(State::Done); }), - onGroupError([widget] { widget->setState(State::Error); }) + onGroupDone([widget](DoneWith result) { widget->setState(resultToState(result)); }) }; return root; }; @@ -183,15 +187,13 @@ int main(int argc, char *argv[]) rootGroup->executeMode(), rootGroup->workflowPolicy(), onGroupSetup([rootGroup] { rootGroup->setState(State::Running); }), - onGroupDone([rootGroup] { rootGroup->setState(State::Done); }), - onGroupError([rootGroup] { rootGroup->setState(State::Error); }), + onGroupDone([rootGroup](DoneWith result) { rootGroup->setState(resultToState(result)); }), Group { groupTask_1->executeMode(), groupTask_1->workflowPolicy(), onGroupSetup([groupTask_1] { groupTask_1->setState(State::Running); }), - onGroupDone([groupTask_1] { groupTask_1->setState(State::Done); }), - onGroupError([groupTask_1] { groupTask_1->setState(State::Error); }), + onGroupDone([groupTask_1](DoneWith result) { groupTask_1->setState(resultToState(result)); }), createTask(task_1_1), createTask(task_1_2), @@ -203,8 +205,7 @@ int main(int argc, char *argv[]) groupTask_4->executeMode(), groupTask_4->workflowPolicy(), onGroupSetup([groupTask_4] { groupTask_4->setState(State::Running); }), - onGroupDone([groupTask_4] { groupTask_4->setState(State::Done); }), - onGroupError([groupTask_4] { groupTask_4->setState(State::Error); }), + onGroupDone([groupTask_4](DoneWith result) { groupTask_4->setState(resultToState(result)); }), createTask(task_4_1), createTask(task_4_2), @@ -212,8 +213,7 @@ int main(int argc, char *argv[]) groupTask_4_3->executeMode(), groupTask_4_3->workflowPolicy(), onGroupSetup([groupTask_4_3] { groupTask_4_3->setState(State::Running); }), - onGroupDone([groupTask_4_3] { groupTask_4_3->setState(State::Done); }), - onGroupError([groupTask_4_3] { groupTask_4_3->setState(State::Error); }), + onGroupDone([groupTask_4_3](DoneWith result) { groupTask_4_3->setState(resultToState(result)); }), createTask(task_4_3_1), createTask(task_4_3_2), diff --git a/tests/manual/tasking/demo/taskwidget.h b/tests/manual/tasking/demo/taskwidget.h index a737e315a4e..2bf3f8719b6 100644 --- a/tests/manual/tasking/demo/taskwidget.h +++ b/tests/manual/tasking/demo/taskwidget.h @@ -20,8 +20,9 @@ QT_END_NAMESPACE enum class State { Initial, Running, - Done, - Error + Done, // TODO: Rename to Success + Error, + // TODO: Add Canceled state }; enum class ExecuteMode { diff --git a/tests/manual/tasking/imagescaling/imagescaling.cpp b/tests/manual/tasking/imagescaling/imagescaling.cpp index fe90bcf546a..ca33779497d 100644 --- a/tests/manual/tasking/imagescaling/imagescaling.cpp +++ b/tests/manual/tasking/imagescaling/imagescaling.cpp @@ -68,7 +68,7 @@ void Images::process() finishAllAndDone, parallel, onGroupSetup(onRootSetup), - onGroupDone(onRootDone) + onGroupDone(onRootDone, CallDoneIf::Success) }; int i = 0;