diff --git a/Core/Console.cpp b/Core/Console.cpp index 555c88e..986daa5 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -465,12 +465,22 @@ ConsoleLock Console::AcquireLock() void Console::Lock() { + shared_ptr debugger = _debugger; + if(debugger) { + debugger->SuspendDebugger(false); + } + _lockCounter++; _runLock.Acquire(); } void Console::Unlock() { + shared_ptr debugger = _debugger; + if(debugger) { + debugger->SuspendDebugger(true); + } + _runLock.Release(); _lockCounter--; } @@ -619,7 +629,15 @@ shared_ptr Console::GetDebugger(bool autoStart) void Console::StopDebugger() { + //Pause/unpause the regular emulation thread based on the debugger's pause state + _paused = IsPaused(); + + shared_ptr debugger = _debugger; + debugger->SuspendDebugger(false); + Lock(); _debugger.reset(); + + Unlock(); } bool Console::IsDebugging() diff --git a/Core/ConsoleLock.cpp b/Core/ConsoleLock.cpp index c0efaec..783fc31 100644 --- a/Core/ConsoleLock.cpp +++ b/Core/ConsoleLock.cpp @@ -6,18 +6,10 @@ ConsoleLock::ConsoleLock(Console *console) { _console = console; - - _debugger = _console->GetDebugger(false); - if(_debugger) { - _debugger->SuspendDebugger(false); - } _console->Lock(); } ConsoleLock::~ConsoleLock() { - if(_debugger) { - _debugger->SuspendDebugger(true); - } _console->Unlock(); } diff --git a/Core/ConsoleLock.h b/Core/ConsoleLock.h index 1713a45..fd79c3d 100644 --- a/Core/ConsoleLock.h +++ b/Core/ConsoleLock.h @@ -8,7 +8,6 @@ class ConsoleLock { private: Console *_console = nullptr; - shared_ptr _debugger; public: ConsoleLock(Console *console); diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index 5eccc57..1330550 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -81,6 +81,10 @@ Debugger::Debugger(shared_ptr console) _codeDataLogger->LoadCdlFile(cdlFile); RefreshCodeCache(); + + if(_console->IsPaused()) { + Step(CpuType::Cpu, 1, StepType::Step); + } } Debugger::~Debugger() @@ -374,7 +378,13 @@ void Debugger::BreakRequest(bool release) void Debugger::SuspendDebugger(bool release) { if(release) { - _suspendRequestCount--; + if(_suspendRequestCount > 0) { + _suspendRequestCount--; + } else { + #ifdef _DEBUG + throw std::runtime_error("unexpected debugger suspend::release call"); + #endif + } } else { _suspendRequestCount++; }