[Kernel] Retain handles and not objects in XThread

This fixes cases introduced by 52e836d0f8
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
This commit is contained in:
Silent 2019-11-30 19:22:39 +01:00 committed by Rick Gibbed
parent 728531eff7
commit c5db959154
1 changed files with 7 additions and 7 deletions

View File

@ -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> 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> XThread::Restore(KernelState* kernel_state,
xe::Profiler::ThreadExit();
// Release the self-reference to the thread.
thread->Release();
thread->ReleaseHandle();
});
// Notify processor we were recreated.