Debugger: Improved pause/unpause behavior when opening/closing debugger or loading states with debugger opened

This commit is contained in:
Sour 2019-10-06 20:41:48 -04:00
parent 8ee5bd5a10
commit ed00a02c51
4 changed files with 29 additions and 10 deletions

View file

@ -465,12 +465,22 @@ ConsoleLock Console::AcquireLock()
void Console::Lock() void Console::Lock()
{ {
shared_ptr<Debugger> debugger = _debugger;
if(debugger) {
debugger->SuspendDebugger(false);
}
_lockCounter++; _lockCounter++;
_runLock.Acquire(); _runLock.Acquire();
} }
void Console::Unlock() void Console::Unlock()
{ {
shared_ptr<Debugger> debugger = _debugger;
if(debugger) {
debugger->SuspendDebugger(true);
}
_runLock.Release(); _runLock.Release();
_lockCounter--; _lockCounter--;
} }
@ -619,7 +629,15 @@ shared_ptr<Debugger> Console::GetDebugger(bool autoStart)
void Console::StopDebugger() void Console::StopDebugger()
{ {
//Pause/unpause the regular emulation thread based on the debugger's pause state
_paused = IsPaused();
shared_ptr<Debugger> debugger = _debugger;
debugger->SuspendDebugger(false);
Lock();
_debugger.reset(); _debugger.reset();
Unlock();
} }
bool Console::IsDebugging() bool Console::IsDebugging()

View file

@ -6,18 +6,10 @@
ConsoleLock::ConsoleLock(Console *console) ConsoleLock::ConsoleLock(Console *console)
{ {
_console = console; _console = console;
_debugger = _console->GetDebugger(false);
if(_debugger) {
_debugger->SuspendDebugger(false);
}
_console->Lock(); _console->Lock();
} }
ConsoleLock::~ConsoleLock() ConsoleLock::~ConsoleLock()
{ {
if(_debugger) {
_debugger->SuspendDebugger(true);
}
_console->Unlock(); _console->Unlock();
} }

View file

@ -8,7 +8,6 @@ class ConsoleLock
{ {
private: private:
Console *_console = nullptr; Console *_console = nullptr;
shared_ptr<Debugger> _debugger;
public: public:
ConsoleLock(Console *console); ConsoleLock(Console *console);

View file

@ -81,6 +81,10 @@ Debugger::Debugger(shared_ptr<Console> console)
_codeDataLogger->LoadCdlFile(cdlFile); _codeDataLogger->LoadCdlFile(cdlFile);
RefreshCodeCache(); RefreshCodeCache();
if(_console->IsPaused()) {
Step(CpuType::Cpu, 1, StepType::Step);
}
} }
Debugger::~Debugger() Debugger::~Debugger()
@ -374,7 +378,13 @@ void Debugger::BreakRequest(bool release)
void Debugger::SuspendDebugger(bool release) void Debugger::SuspendDebugger(bool release)
{ {
if(release) { if(release) {
_suspendRequestCount--; if(_suspendRequestCount > 0) {
_suspendRequestCount--;
} else {
#ifdef _DEBUG
throw std::runtime_error("unexpected debugger suspend::release call");
#endif
}
} else { } else {
_suspendRequestCount++; _suspendRequestCount++;
} }