From bff24daa8b7f5f0a35a68fd5ea5cf356cc66c349 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 16 Apr 2025 16:48:28 +0200 Subject: [PATCH] Debugger: Introduce debuggerRecipe() Task-number: QTCREATORBUG-29168 Change-Id: I888ae42672522af69434590dd4b6610971a41b6f Reviewed-by: hjk --- src/plugins/debugger/debuggerruncontrol.cpp | 50 +++++++++++++++++++++ src/plugins/debugger/debuggerruncontrol.h | 5 +++ 2 files changed, 55 insertions(+) diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 1cd15c80ee8..ff64feea93b 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -785,6 +785,56 @@ void DebuggerRunTool::start() }); } +Group debuggerRecipe(RunControl *runControl, const DebuggerRunParameters &initialParameters, + const std::function ¶metersModifier) +{ + const Storage parametersStorage{initialParameters}; + const Storage driverStorage; + const Storage tempCoreFileStorage; + const Storage> terminalStorage; + + const auto onSetup = [runControl, parametersStorage, parametersModifier] { + parametersStorage->setAttachPid(runControl->attachPid()); + if (parametersModifier) + parametersModifier(*parametersStorage); + }; + + const auto terminalKicker = [parametersStorage, driverStorage, terminalStorage](const SingleBarrier &barrier) { + return terminalRecipe(parametersStorage, driverStorage, terminalStorage, barrier); + }; + + const auto debugServerKicker = [runControl, parametersStorage](const SingleBarrier &barrier) { + return debugServerRecipe(runControl, parametersStorage, barrier); + }; + + const auto onDone = [parametersStorage, tempCoreFileStorage] { + if (tempCoreFileStorage->exists()) + tempCoreFileStorage->removeFile(); + if (parametersStorage->isSnapshot() && !parametersStorage->coreFile().isEmpty()) + parametersStorage->coreFile().removeFile(); + }; + + return { + parametersStorage, + driverStorage, + terminalStorage, + tempCoreFileStorage, + continueOnError, + onGroupSetup(onSetup), + Group { + coreFileRecipe(runControl, parametersStorage, tempCoreFileStorage), + When (terminalKicker) >> Do { + fixupParamsRecipe(runControl, parametersStorage), + When (debugServerKicker) >> Do { + startEnginesRecipe(runControl, parametersStorage, driverStorage) + } + } + }.withCancel(canceler()), + finalizeRecipe(driverStorage, terminalStorage), + onGroupDone(onDone) + }; +} + void DebuggerRunTool::stop() { if (!d->m_taskTreeRunner.isRunning()) diff --git a/src/plugins/debugger/debuggerruncontrol.h b/src/plugins/debugger/debuggerruncontrol.h index 137e7fdb889..a8c607a7ba2 100644 --- a/src/plugins/debugger/debuggerruncontrol.h +++ b/src/plugins/debugger/debuggerruncontrol.h @@ -14,6 +14,11 @@ namespace Debugger { namespace Internal { class DebuggerRunToolPrivate; } +DEBUGGER_EXPORT Tasking::Group debuggerRecipe( + ProjectExplorer::RunControl *runControl, + const DebuggerRunParameters &initialParameters, + const std::function ¶metersModifier = {}); + class DEBUGGER_EXPORT DebuggerRunTool final : public ProjectExplorer::RunWorker { Q_OBJECT