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