From 4b19db5505b939997f551e41faa36f4ed2d496b2 Mon Sep 17 00:00:00 2001 From: Nav Date: Wed, 27 Apr 2022 22:08:14 +0100 Subject: [PATCH] Fixed bug with GDB debug server not allowing any time for the TargetController to wake up. --- src/DebugServer/Gdb/GdbRspDebugServer.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/DebugServer/Gdb/GdbRspDebugServer.cpp b/src/DebugServer/Gdb/GdbRspDebugServer.cpp index 71fc4b6c..b42851e9 100644 --- a/src/DebugServer/Gdb/GdbRspDebugServer.cpp +++ b/src/DebugServer/Gdb/GdbRspDebugServer.cpp @@ -152,8 +152,26 @@ namespace Bloom::DebugServer::Gdb * service it. */ if (!this->targetControllerConsole.isTargetControllerInService()) { - this->terminateActiveDebugSession(); - throw DebugSessionAborted("TargetController not in service"); + // The TargetController is suspended - allow it some time to wake up + + /* + * At first, it may seem like there is a possibility that we may miss the + * TargetControllerStateChanged event here. But this is nothing to worry about because + * this->eventListener is already listening for TargetControllerStateChanged events, so if an event + * does fire in between the call to isTargetControllerInService() (above) and waitForEvent() (below), + * then waitForEvent() will return immediately with the event. + */ + const auto targetControllerStateChangedEvent = this->eventListener.waitForEvent< + Events::TargetControllerStateChanged + >(std::chrono::milliseconds(10000)); + + if ( + !targetControllerStateChangedEvent.has_value() + || targetControllerStateChangedEvent->get()->state != TargetControllerState::ACTIVE + ) { + this->terminateActiveDebugSession(); + throw DebugSessionAborted("TargetController not in service"); + } } }