Debugger: Fixed some deadlocks

This commit is contained in:
Souryo 2016-07-31 14:31:44 -04:00
parent 614fee646c
commit e28ce321d4
4 changed files with 17 additions and 13 deletions

View file

@ -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 = _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> 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> 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<Debugger> Console::GetDebugger()
{
auto lock = _debuggerLock.AcquireSafe();
if(!_debugger) {
_debugger.reset(new Debugger(Console::Instance, _cpu, _ppu, _memoryManager, _mapper));
}

View file

@ -23,6 +23,7 @@ class Console
shared_ptr<PPU> _ppu;
unique_ptr<APU> _apu;
shared_ptr<Debugger> _debugger;
SimpleLock _debuggerLock;
shared_ptr<BaseMapper> _mapper;
unique_ptr<ControlManager> _controlManager;
shared_ptr<MemoryManager> _memoryManager;

View file

@ -307,11 +307,11 @@ void Debugger::PrivateProcessRamOperation(MemoryOperationType type, uint16_t &ad
breakDone = SleepUntilResume();
if(_traceLogger) {
auto lock = _traceLock.AcquireSafe();
shared_ptr<TraceLogger> 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();
}

View file

@ -69,8 +69,7 @@ private:
SimpleLock _breakLock;
unique_ptr<TraceLogger> _traceLogger;
SimpleLock _traceLock;
shared_ptr<TraceLogger> _traceLogger;
uint16_t *_currentReadAddr; //Used to alter the executing address via "Set Next Statement"