summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSilent <zdanio95@gmail.com>2019-11-15 23:08:37 +0100
committerRick Gibbed <rick@gibbed.us>2019-11-30 20:08:30 -0600
commit728531eff7b3af41fa85685185334a0da1160d4f (patch)
treeaad149f955bfa7a8f21dbd3999a750cb44a8e651
parent05ef022fd72357bc72750a0c6529eacba74e76fd (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.cc6
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;