Skip to content

Commit

Permalink
GE Debugger: Prevent hang on shutdown.
Browse files Browse the repository at this point in the history
Since we're blocking the Emu thread, we can't use a hook from the Emu
thread to wake up.

The change to lifecycle callbacks caused this.
  • Loading branch information
unknownbrackets committed Jun 11, 2018
1 parent 6c494c3 commit 0ed2c03
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 12 deletions.
16 changes: 12 additions & 4 deletions Core/Core.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ static std::condition_variable m_InactiveCond;
static std::mutex m_hInactiveMutex; static std::mutex m_hInactiveMutex;
static bool singleStepPending = false; static bool singleStepPending = false;
static int steppingCounter = 0; static int steppingCounter = 0;
static std::set<CoreLifecycleFunc> shutdownFuncs; static std::set<CoreLifecycleFunc> lifecycleFuncs;
static std::set<CoreStopRequestFunc> stopFuncs;
static bool windowHidden = false; static bool windowHidden = false;
static double lastActivity = 0.0; static double lastActivity = 0.0;
static double lastKeepAwake = 0.0; static double lastKeepAwake = 0.0;
Expand All @@ -76,17 +77,24 @@ void Core_NotifyActivity() {
} }


void Core_ListenLifecycle(CoreLifecycleFunc func) { void Core_ListenLifecycle(CoreLifecycleFunc func) {
shutdownFuncs.insert(func); lifecycleFuncs.insert(func);
} }


void Core_NotifyLifecycle(CoreLifecycle stage) { void Core_NotifyLifecycle(CoreLifecycle stage) {
for (auto it = shutdownFuncs.begin(); it != shutdownFuncs.end(); ++it) { for (auto func : lifecycleFuncs) {
(*it)(stage); func(stage);
} }
} }


void Core_ListenStopRequest(CoreStopRequestFunc func) {
stopFuncs.insert(func);
}

void Core_Stop() { void Core_Stop() {
Core_UpdateState(CORE_POWERDOWN); Core_UpdateState(CORE_POWERDOWN);
for (auto func : stopFuncs) {
func();
}
} }


bool Core_IsStepping() { bool Core_IsStepping() {
Expand Down
5 changes: 5 additions & 0 deletions Core/Core.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -51,10 +51,15 @@ enum class CoreLifecycle {
MEMORY_REINITED, MEMORY_REINITED,
}; };


// Callback is called on the Emu thread.
typedef void (* CoreLifecycleFunc)(CoreLifecycle stage); typedef void (* CoreLifecycleFunc)(CoreLifecycle stage);
void Core_ListenLifecycle(CoreLifecycleFunc func); void Core_ListenLifecycle(CoreLifecycleFunc func);
void Core_NotifyLifecycle(CoreLifecycle stage); void Core_NotifyLifecycle(CoreLifecycle stage);


// Callback is executed on requesting thread.
typedef void (* CoreStopRequestFunc)();
void Core_ListenStopRequest(CoreStopRequestFunc callback);

bool Core_IsStepping(); bool Core_IsStepping();


bool Core_IsActive(); bool Core_IsActive();
Expand Down
10 changes: 4 additions & 6 deletions GPU/Debugger/Stepping.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -197,12 +197,10 @@ void ResumeFromStepping() {
SetPauseAction(PAUSE_CONTINUE, false); SetPauseAction(PAUSE_CONTINUE, false);
} }


void ForceUnpause(CoreLifecycle stage) { void ForceUnpause() {
if (stage == CoreLifecycle::STOPPING) { SetPauseAction(PAUSE_CONTINUE, false);
SetPauseAction(PAUSE_CONTINUE, false); actionComplete = true;
actionComplete = true; actionWait.notify_all();
actionWait.notify_all();
}
} }


} // namespace } // namespace
2 changes: 1 addition & 1 deletion GPU/Debugger/Stepping.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -38,5 +38,5 @@ namespace GPUStepping {
bool GPU_SetCmdValue(u32 op); bool GPU_SetCmdValue(u32 op);


void ResumeFromStepping(); void ResumeFromStepping();
void ForceUnpause(CoreLifecycle stage); void ForceUnpause();
}; };
2 changes: 1 addition & 1 deletion Windows/GEDebugger/GEDebugger.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ void CGEDebugger::Init() {
CGEDebugger::CGEDebugger(HINSTANCE _hInstance, HWND _hParent) CGEDebugger::CGEDebugger(HINSTANCE _hInstance, HWND _hParent)
: Dialog((LPCSTR)IDD_GEDEBUGGER, _hInstance, _hParent) { : Dialog((LPCSTR)IDD_GEDEBUGGER, _hInstance, _hParent) {
GPUBreakpoints::Init(); GPUBreakpoints::Init();
Core_ListenLifecycle(ForceUnpause); Core_ListenStopRequest(ForceUnpause);


// minimum size = a little more than the default // minimum size = a little more than the default
RECT windowRect; RECT windowRect;
Expand Down

0 comments on commit 0ed2c03

Please sign in to comment.