From c5db959154d1e9db014fb646bc0b9c1b660a3587 Mon Sep 17 00:00:00 2001 From: Silent Date: Sat, 30 Nov 2019 19:22:39 +0100 Subject: [PATCH] [Kernel] Retain handles and not objects in XThread This fixes cases introduced by 52e836d0f81e752ba368717e68773b591adfa9cf where thread handles get closed before the thread finishes. Handle was assumed to be alive there, which was not true as threads self-referenced only their objects, not their handles. Affected games: Payday 2 Demo --- src/xenia/kernel/xthread.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/xenia/kernel/xthread.cc b/src/xenia/kernel/xthread.cc index 7ba7db2eb..a1e6007a2 100644 --- a/src/xenia/kernel/xthread.cc +++ b/src/xenia/kernel/xthread.cc @@ -364,7 +364,7 @@ X_STATUS XThread::Create() { InitializeGuestObject(); // Always retain when starting - the thread owns itself until exited. - Retain(); + RetainHandle(); xe::threading::Thread::CreationParameters params; params.stack_size = 16 * 1024 * 1024; // Allocate a big host stack. @@ -405,7 +405,7 @@ X_STATUS XThread::Create() { xe::Profiler::ThreadExit(); // Release the self-reference to the thread. - Release(); + ReleaseHandle(); }); if (!thread_) { @@ -464,7 +464,7 @@ X_STATUS XThread::Exit(int exit_code) { xe::Profiler::ThreadExit(); running_ = false; - Release(); + ReleaseHandle(); // NOTE: this does not return! xe::threading::Thread::Exit(exit_code); @@ -484,11 +484,11 @@ X_STATUS XThread::Terminate(int exit_code) { running_ = false; if (XThread::IsInThread(this)) { - Release(); + ReleaseHandle(); xe::threading::Thread::Exit(exit_code); } else { thread_->Terminate(exit_code); - Release(); + ReleaseHandle(); } return X_STATUS_SUCCESS; @@ -991,7 +991,7 @@ object_ref XThread::Restore(KernelState* kernel_state, context->vscr_sat = state.context.vscr_sat; // Always retain when starting - the thread owns itself until exited. - thread->Retain(); + thread->RetainHandle(); xe::threading::Thread::CreationParameters params; params.create_suspended = true; // Not done restoring yet. @@ -1033,7 +1033,7 @@ object_ref XThread::Restore(KernelState* kernel_state, xe::Profiler::ThreadExit(); // Release the self-reference to the thread. - thread->Release(); + thread->ReleaseHandle(); }); // Notify processor we were recreated.