diff options
| author | Silent <zdanio95@gmail.com> | 2019-11-15 23:08:37 +0100 |
|---|---|---|
| committer | Rick Gibbed <rick@gibbed.us> | 2019-11-30 20:08:30 -0600 |
| commit | 728531eff7b3af41fa85685185334a0da1160d4f (patch) | |
| tree | aad149f955bfa7a8f21dbd3999a750cb44a8e651 | |
| parent | 05ef022fd72357bc72750a0c6529eacba74e76fd (diff) | |
[Kernel] Operate on handle refcounts in Ob funcs
Although this seems counter-intuitive, operating on handle
reference counters in
- ObLookupThreadByThreadId
- ObReferenceObjectByHandle
- ObDereferenceObject
allows to cleanly clean up handles for resources created elsewhere
and destructed by ObDereferenceObject (for example, threads with 0x80
creation flag). Operating on pointer reference counters alone
would leave a stray handle in the slots list.
| -rw-r--r-- | src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc index 1593fe2f5..8f856cd94 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc @@ -69,7 +69,7 @@ dword_result_t ObLookupThreadByThreadId(dword_t thread_id, } // Retain the object. Will be released in ObDereferenceObject. - thread->Retain(); + thread->RetainHandle(); *out_object_ptr = thread->guest_object(); return X_STATUS_SUCCESS; } @@ -133,7 +133,7 @@ dword_result_t ObReferenceObjectByHandle(dword_t handle, // Caller takes the reference. // It's released in ObDereferenceObject. - object->Retain(); + object->RetainHandle(); if (out_object_ptr.guest_address()) { *out_object_ptr = native_ptr; } @@ -169,7 +169,7 @@ dword_result_t ObDereferenceObject(dword_t native_ptr) { auto object = XObject::GetNativeObject<XObject>( kernel_state(), kernel_memory()->TranslateVirtual(native_ptr)); if (object) { - object->Release(); + object->ReleaseHandle(); } return 0; |
