From e28ce321d49890bff780be983d38bae85b473a74 Mon Sep 17 00:00:00 2001 From: Souryo Date: Sun, 31 Jul 2016 14:31:44 -0400 Subject: [PATCH] Debugger: Fixed some deadlocks --- Core/Console.cpp | 18 ++++++++++++------ Core/Console.h | 1 + Core/Debugger.cpp | 8 +++----- Core/Debugger.h | 3 +-- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/Core/Console.cpp b/Core/Console.cpp index d2896304..d648890b 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -82,6 +82,7 @@ void Console::Initialize(string romFilename, stringstream *filestream, string ip _initialized = true; if(_debugger) { + auto lock = _debuggerLock.AcquireSafe(); StopDebugger(); GetDebugger(); } @@ -229,8 +230,10 @@ void Console::Stop() { _stop = true; EmulationSettings::ClearFlags(EmulationFlags::Paused); - if(_debugger) { - _debugger->Run(); + + shared_ptr debugger = _debugger; + if(debugger) { + debugger->Run(); } _stopLock.Acquire(); _stopLock.Release(); @@ -238,9 +241,10 @@ void Console::Stop() void Console::Pause() { - if(Console::Instance->_debugger) { + shared_ptr debugger = Console::Instance->_debugger; + if(debugger) { //Make sure debugger resumes if we try to pause the emu, otherwise we will get deadlocked. - Console::Instance->_debugger->Suspend(); + debugger->Suspend(); } Console::Instance->_pauseLock.Acquire(); //Spin wait until emu pauses @@ -252,9 +256,10 @@ void Console::Resume() Console::Instance->_runLock.Release(); Console::Instance->_pauseLock.Release(); - if(Console::Instance->_debugger) { + shared_ptr debugger = Console::Instance->_debugger; + if(debugger) { //Make sure debugger resumes if we try to pause the emu, otherwise we will get deadlocked. - Console::Instance->_debugger->Resume(); + debugger->Resume(); } } @@ -452,6 +457,7 @@ void Console::LoadState(uint8_t *buffer, uint32_t bufferSize) std::shared_ptr Console::GetDebugger() { + auto lock = _debuggerLock.AcquireSafe(); if(!_debugger) { _debugger.reset(new Debugger(Console::Instance, _cpu, _ppu, _memoryManager, _mapper)); } diff --git a/Core/Console.h b/Core/Console.h index 465ac69f..a26eb64e 100644 --- a/Core/Console.h +++ b/Core/Console.h @@ -23,6 +23,7 @@ class Console shared_ptr _ppu; unique_ptr _apu; shared_ptr _debugger; + SimpleLock _debuggerLock; shared_ptr _mapper; unique_ptr _controlManager; shared_ptr _memoryManager; diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index 794ebf70..0d89a444 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -307,11 +307,11 @@ void Debugger::PrivateProcessRamOperation(MemoryOperationType type, uint16_t &ad breakDone = SleepUntilResume(); - if(_traceLogger) { - auto lock = _traceLock.AcquireSafe(); + shared_ptr logger = _traceLogger; + if(logger) { DebugState state; GetState(&state); - _traceLogger->Log(state, _disassembler->GetDisassemblyInfo(absoluteAddr, absoluteRamAddr, addr)); + logger->Log(state, _disassembler->GetDisassemblyInfo(absoluteAddr, absoluteRamAddr, addr)); } } @@ -518,14 +518,12 @@ void Debugger::SetNextStatement(uint16_t addr) void Debugger::StartTraceLogger(TraceLoggerOptions options) { - auto lock = _traceLock.AcquireSafe(); string traceFilepath = FolderUtilities::CombinePath(FolderUtilities::GetDebuggerFolder(), "Trace.txt"); _traceLogger.reset(new TraceLogger(traceFilepath, options)); } void Debugger::StopTraceLogger() { - auto lock = _traceLock.AcquireSafe(); _traceLogger.reset(); } diff --git a/Core/Debugger.h b/Core/Debugger.h index 8c696f73..768d8181 100644 --- a/Core/Debugger.h +++ b/Core/Debugger.h @@ -69,8 +69,7 @@ private: SimpleLock _breakLock; - unique_ptr _traceLogger; - SimpleLock _traceLock; + shared_ptr _traceLogger; uint16_t *_currentReadAddr; //Used to alter the executing address via "Set Next Statement"