Debugger: Fixed crash when closing Lua script window (if script isn't running and it is the only debugger window opened)

This commit is contained in:
Sour 2019-01-27 14:31:05 -05:00
parent dd72d2669f
commit 9905f3a5da
5 changed files with 18 additions and 11 deletions

View file

@ -1084,7 +1084,9 @@ std::shared_ptr<Debugger> Console::GetDebugger(bool autoStart)
void Console::StopDebugger()
{
_debugger->ReleaseDebugger();
if(_debugger) {
_debugger->ReleaseDebugger(_running);
}
_debugger.reset();
}

View file

@ -126,11 +126,11 @@ Debugger::Debugger(shared_ptr<Console> console, shared_ptr<CPU> cpu, shared_ptr<
Debugger::~Debugger()
{
if(!_released) {
ReleaseDebugger();
ReleaseDebugger(true);
}
}
void Debugger::ReleaseDebugger()
void Debugger::ReleaseDebugger(bool needPause)
{
auto lock = _releaseLock.AcquireSafe();
if(!_released) {
@ -138,7 +138,12 @@ void Debugger::ReleaseDebugger()
_stopFlag = true;
_console->Pause();
if(needPause) {
//ReleaseDebugger is called in the callback for "BeforeEmulationStop"
//calling Pause in this scenario will cause a deadlock, but doing so is
//unnecessary, so we can just skip it.
_console->Pause();
}
{
auto lock = _scriptLock.AcquireSafe();
@ -152,7 +157,10 @@ void Debugger::ReleaseDebugger()
_breakLock.Acquire();
_breakLock.Release();
_console->Resume();
if(needPause) {
_console->Resume();
}
_released = true;
}

View file

@ -163,7 +163,7 @@ public:
Debugger(shared_ptr<Console> console, shared_ptr<CPU> cpu, shared_ptr<PPU> ppu, shared_ptr<APU> apu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseMapper> mapper);
~Debugger();
void ReleaseDebugger();
void ReleaseDebugger(bool needPause);
void SetPpu(shared_ptr<PPU> ppu);
Console* GetConsole();

View file

@ -157,11 +157,7 @@ namespace Mesen.GUI.Debugger
if(_openedWindows.Count == 0) {
//All windows have been closed, disable debugger
DebugWorkspaceManager.Clear();
Task.Run(() => {
//Run this in another thread to avoid deadlocks when this is called within a notification handler
InteropEmu.DebugRelease();
});
InteropEmu.DebugRelease();
}
}

View file

@ -702,6 +702,7 @@ namespace Mesen.GUI.Forms
break;
case InteropEmu.ConsoleNotificationType.BeforeEmulationStop:
//Close all debugger windows before continuing.
this.Invoke((Action)(() => {
DebugWindowManager.CloseAll();
}));