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:
parent
dd72d2669f
commit
9905f3a5da
5 changed files with 18 additions and 11 deletions
|
@ -1084,7 +1084,9 @@ std::shared_ptr<Debugger> Console::GetDebugger(bool autoStart)
|
|||
|
||||
void Console::StopDebugger()
|
||||
{
|
||||
_debugger->ReleaseDebugger();
|
||||
if(_debugger) {
|
||||
_debugger->ReleaseDebugger(_running);
|
||||
}
|
||||
_debugger.reset();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -702,6 +702,7 @@ namespace Mesen.GUI.Forms
|
|||
break;
|
||||
|
||||
case InteropEmu.ConsoleNotificationType.BeforeEmulationStop:
|
||||
//Close all debugger windows before continuing.
|
||||
this.Invoke((Action)(() => {
|
||||
DebugWindowManager.CloseAll();
|
||||
}));
|
||||
|
|
Loading…
Add table
Reference in a new issue