[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:
parent
728531eff7
commit
c5db959154
|
@ -364,7 +364,7 @@ X_STATUS XThread::Create() {
|
||||||
InitializeGuestObject();
|
InitializeGuestObject();
|
||||||
|
|
||||||
// Always retain when starting - the thread owns itself until exited.
|
// Always retain when starting - the thread owns itself until exited.
|
||||||
Retain();
|
RetainHandle();
|
||||||
|
|
||||||
xe::threading::Thread::CreationParameters params;
|
xe::threading::Thread::CreationParameters params;
|
||||||
params.stack_size = 16 * 1024 * 1024; // Allocate a big host stack.
|
params.stack_size = 16 * 1024 * 1024; // Allocate a big host stack.
|
||||||
|
@ -405,7 +405,7 @@ X_STATUS XThread::Create() {
|
||||||
xe::Profiler::ThreadExit();
|
xe::Profiler::ThreadExit();
|
||||||
|
|
||||||
// Release the self-reference to the thread.
|
// Release the self-reference to the thread.
|
||||||
Release();
|
ReleaseHandle();
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!thread_) {
|
if (!thread_) {
|
||||||
|
@ -464,7 +464,7 @@ X_STATUS XThread::Exit(int exit_code) {
|
||||||
xe::Profiler::ThreadExit();
|
xe::Profiler::ThreadExit();
|
||||||
|
|
||||||
running_ = false;
|
running_ = false;
|
||||||
Release();
|
ReleaseHandle();
|
||||||
|
|
||||||
// NOTE: this does not return!
|
// NOTE: this does not return!
|
||||||
xe::threading::Thread::Exit(exit_code);
|
xe::threading::Thread::Exit(exit_code);
|
||||||
|
@ -484,11 +484,11 @@ X_STATUS XThread::Terminate(int exit_code) {
|
||||||
|
|
||||||
running_ = false;
|
running_ = false;
|
||||||
if (XThread::IsInThread(this)) {
|
if (XThread::IsInThread(this)) {
|
||||||
Release();
|
ReleaseHandle();
|
||||||
xe::threading::Thread::Exit(exit_code);
|
xe::threading::Thread::Exit(exit_code);
|
||||||
} else {
|
} else {
|
||||||
thread_->Terminate(exit_code);
|
thread_->Terminate(exit_code);
|
||||||
Release();
|
ReleaseHandle();
|
||||||
}
|
}
|
||||||
|
|
||||||
return X_STATUS_SUCCESS;
|
return X_STATUS_SUCCESS;
|
||||||
|
@ -991,7 +991,7 @@ object_ref<XThread> XThread::Restore(KernelState* kernel_state,
|
||||||
context->vscr_sat = state.context.vscr_sat;
|
context->vscr_sat = state.context.vscr_sat;
|
||||||
|
|
||||||
// Always retain when starting - the thread owns itself until exited.
|
// Always retain when starting - the thread owns itself until exited.
|
||||||
thread->Retain();
|
thread->RetainHandle();
|
||||||
|
|
||||||
xe::threading::Thread::CreationParameters params;
|
xe::threading::Thread::CreationParameters params;
|
||||||
params.create_suspended = true; // Not done restoring yet.
|
params.create_suspended = true; // Not done restoring yet.
|
||||||
|
@ -1033,7 +1033,7 @@ object_ref<XThread> XThread::Restore(KernelState* kernel_state,
|
||||||
xe::Profiler::ThreadExit();
|
xe::Profiler::ThreadExit();
|
||||||
|
|
||||||
// Release the self-reference to the thread.
|
// Release the self-reference to the thread.
|
||||||
thread->Release();
|
thread->ReleaseHandle();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Notify processor we were recreated.
|
// Notify processor we were recreated.
|
||||||
|
|
Loading…
Reference in New Issue