From 92b07391df8c5bcc3cdccfe9f5a4c815f6d025fc Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Sat, 13 Dec 2025 20:54:08 +0900 Subject: [PATCH] [Linux/Threading] change self-suspend to wait to be resumed --- src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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);