From f771faf82d3995d3c30a7fc17e321bd2fe9ebf54 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 6 Nov 2023 19:17:28 +0100 Subject: [PATCH] TaskTree: Use DoneResult in Group done handler Instead of using ambiguous bool. Change-Id: Icf63f0b129d4b81cc4324d7a100f5aaf2c8af44b Reviewed-by: hjk --- src/libs/solutions/tasking/tasktree.cpp | 12 ++++----- src/libs/solutions/tasking/tasktree.h | 22 ++++++++-------- tests/auto/solutions/tasking/tst_tasking.cpp | 27 ++++++++------------ 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp index 0452a047709..7bc9c8a5970 100644 --- a/src/libs/solutions/tasking/tasktree.cpp +++ b/src/libs/solutions/tasking/tasktree.cpp @@ -1086,7 +1086,7 @@ public: SetupResult startChildren(int nextChild); SetupResult childDone(bool success); void stop(); - bool invokeDoneHandler(DoneWith result); + bool invokeDoneHandler(DoneWith doneWith); bool isRunning() const { return m_runtimeData.has_value(); } bool isStarting() const { return isRunning() && m_runtimeData->m_startGuard.isLocked(); } @@ -1451,15 +1451,15 @@ static bool shouldCall(CallDoneIf callDoneIf, DoneWith result) return callDoneIf != CallDoneIf::Success; } -bool TaskContainer::invokeDoneHandler(DoneWith result) +bool TaskContainer::invokeDoneHandler(DoneWith doneWith) { - bool success = result == DoneWith::Success; + DoneResult result = toDoneResult(doneWith); const GroupItem::GroupHandler &groupHandler = m_constData.m_groupHandler; - if (groupHandler.m_doneHandler && shouldCall(groupHandler.m_callDoneIf, result)) - success = invokeHandler(this, groupHandler.m_doneHandler, result); + if (groupHandler.m_doneHandler && shouldCall(groupHandler.m_callDoneIf, doneWith)) + result = invokeHandler(this, groupHandler.m_doneHandler, doneWith); m_runtimeData->m_callStorageDoneHandlersOnDestruction = true; m_runtimeData.reset(); - return success; + return result == DoneResult::Success; } SetupResult TaskNode::start() diff --git a/src/libs/solutions/tasking/tasktree.h b/src/libs/solutions/tasking/tasktree.h index 3690fcf291e..60fe56fcf7c 100644 --- a/src/libs/solutions/tasking/tasktree.h +++ b/src/libs/solutions/tasking/tasktree.h @@ -194,7 +194,7 @@ public: // Called when group entered, after group's storages are created using GroupSetupHandler = std::function; // Called when group done, before group's storages are deleted - using GroupDoneHandler = std::function; + using GroupDoneHandler = std::function; struct TaskHandler { TaskCreateHandler m_createHandler; @@ -315,24 +315,24 @@ private: template static GroupDoneHandler wrapGroupDone(Handler &&handler) { - // B, V, D stands for: [B]ool, [V]oid, [D]oneWith - static constexpr bool isBD = isInvocable(); - static constexpr bool isB = isInvocable(); - static constexpr bool isVD = isInvocable(); + // D, V, W stands for: [D]oneResult, [V]oid, Done[W]ith + static constexpr bool isDW = isInvocable(); + static constexpr bool isD = isInvocable(); + static constexpr bool isVW = isInvocable(); static constexpr bool isV = isInvocable(); - static_assert(isBD || isB || isVD || isV, + static_assert(isDW || isD || isVW || isV, "Group done handler needs to take (DoneWith) or (void) as an argument and has to " - "return void or bool. The passed handler doesn't fulfill these requirements."); + "return void or DoneResult. The passed handler doesn't fulfill these requirements."); return [=](DoneWith result) { - if constexpr (isBD) + if constexpr (isDW) return std::invoke(handler, result); - if constexpr (isB) + if constexpr (isD) return std::invoke(handler); - if constexpr (isVD) + if constexpr (isVW) std::invoke(handler, result); else if constexpr (isV) std::invoke(handler); - return result == DoneWith::Success; + return result == DoneWith::Success ? DoneResult::Success : DoneResult::Error; }; }; }; diff --git a/tests/auto/solutions/tasking/tst_tasking.cpp b/tests/auto/solutions/tasking/tst_tasking.cpp index 9dc0bcdaf88..2b9addfdfe7 100644 --- a/tests/auto/solutions/tasking/tst_tasking.cpp +++ b/tests/auto/solutions/tasking/tst_tasking.cpp @@ -392,11 +392,6 @@ static Handler toTweakSetupHandler(SetupResult result) return Handler::TweakSetupToContinue; } -static Handler toTweakDoneHandler(bool success) -{ - return success ? Handler::TweakDoneToSuccess : Handler::TweakDoneToError; -} - static Handler toTweakDoneHandler(DoneResult result) { return result == DoneResult::Success ? Handler::TweakDoneToSuccess : Handler::TweakDoneToError; @@ -551,11 +546,11 @@ void tst_Tasking::testTree_data() return desiredResult; }); }; - const auto groupDoneWithTweak = [storage](int taskId, bool desiredResult) { - return onGroupDone([storage, taskId, desiredResult](DoneWith result) { - storage->m_log.append({taskId, resultToGroupHandler(result)}); - storage->m_log.append({taskId, toTweakDoneHandler(desiredResult)}); - return desiredResult; + const auto groupDoneWithTweak = [storage](int taskId, DoneResult result) { + return onGroupDone([storage, taskId, result](DoneWith doneWith) { + storage->m_log.append({taskId, resultToGroupHandler(doneWith)}); + storage->m_log.append({taskId, toTweakDoneHandler(result)}); + return result; }); }; const auto createSync = [storage](int taskId) { @@ -1611,18 +1606,18 @@ void tst_Tasking::testTree_data() { // This test checks whether group done handler's result is properly dispatched. const auto createRoot = [storage, createTask, groupDone, groupDoneWithTweak]( - DoneResult firstResult, bool desiredResult) { + DoneResult firstResult, DoneResult secondResult) { return Group { Storage(storage), Group { createTask(1, firstResult), - groupDoneWithTweak(1, desiredResult) + groupDoneWithTweak(1, secondResult) }, groupDone(0) }; }; - const Group root1 = createRoot(DoneResult::Success, true); + const Group root1 = createRoot(DoneResult::Success, DoneResult::Success); const Log log1 { {1, Handler::Setup}, {1, Handler::Success}, @@ -1633,7 +1628,7 @@ void tst_Tasking::testTree_data() QTest::newRow("GroupDoneWithSuccessTweakToSuccess") << TestData{storage, root1, log1, 1, OnDone::Success}; - const Group root2 = createRoot(DoneResult::Success, false); + const Group root2 = createRoot(DoneResult::Success, DoneResult::Error); const Log log2 { {1, Handler::Setup}, {1, Handler::Success}, @@ -1644,7 +1639,7 @@ void tst_Tasking::testTree_data() QTest::newRow("GroupDoneWithSuccessTweakToError") << TestData{storage, root2, log2, 1, OnDone::Failure}; - const Group root3 = createRoot(DoneResult::Error, true); + const Group root3 = createRoot(DoneResult::Error, DoneResult::Success); const Log log3 { {1, Handler::Setup}, {1, Handler::Error}, @@ -1655,7 +1650,7 @@ void tst_Tasking::testTree_data() QTest::newRow("GroupDoneWithErrorTweakToSuccess") << TestData{storage, root3, log3, 1, OnDone::Success}; - const Group root4 = createRoot(DoneResult::Error, false); + const Group root4 = createRoot(DoneResult::Error, DoneResult::Error); const Log log4 { {1, Handler::Setup}, {1, Handler::Error},