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()
{
shared_ptr<Debugger> debugger = _debugger;
if(debugger) {
debugger->SuspendDebugger(false);
}
_lockCounter++;
_runLock.Acquire();
}
void Console::Unlock()
{
shared_ptr<Debugger> debugger = _debugger;
if(debugger) {
debugger->SuspendDebugger(true);
}
_runLock.Release();
_lockCounter--;
}
@ -619,7 +629,15 @@ shared_ptr<Debugger> 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;
debugger->SuspendDebugger(false);
Lock();
_debugger.reset();
Unlock();
}
bool Console::IsDebugging()

View file

@ -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();
}

View file

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

View file

@ -81,6 +81,10 @@ Debugger::Debugger(shared_ptr<Console> 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++;
}