Debugger: Improved pause/unpause behavior when opening/closing debugger or loading states with debugger opened
This commit is contained in:
parent
8ee5bd5a10
commit
ed00a02c51
4 changed files with 29 additions and 10 deletions
|
@ -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()
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
if(_suspendRequestCount > 0) {
|
||||||
_suspendRequestCount--;
|
_suspendRequestCount--;
|
||||||
|
} else {
|
||||||
|
#ifdef _DEBUG
|
||||||
|
throw std::runtime_error("unexpected debugger suspend::release call");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_suspendRequestCount++;
|
_suspendRequestCount++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue