diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc index fba756fee..f284f88bc 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc @@ -251,15 +251,19 @@ dword_result_t NtSuspendThread_entry(dword_t handle, (current_pcr->prcb_data.current_thread == thread->guest_object()); if (is_self_suspend) { - // Self-suspension: just increment the suspend count and return - // The thread continues running - this matches Windows/Xbox behavior + // Self-suspension: increment the suspend count and wait until + // another thread resumes us (decrements count to 0) auto guest_thread = thread->guest_object(); suspend_count = guest_thread->suspend_count; guest_thread->suspend_count++; result = X_STATUS_SUCCESS; - XELOGD( - "Thread {:X} self-suspending (count: {}) - continuing execution", - thread->handle(), guest_thread->suspend_count); + XELOGD("Thread {:X} self-suspending (count: {}) - waiting for resume", + thread->handle(), guest_thread->suspend_count); + // Wait until suspend_count reaches 0 (resumed by another thread) + while (guest_thread->suspend_count > 0) { + xe::threading::Sleep(std::chrono::microseconds(100)); + } + XELOGD("Thread {:X} resumed", thread->handle()); } else { // Normal suspension of another thread result = thread->Suspend(&suspend_count);