From e54477d0e4c787e567b4f7ac41b85ca69e59cf04 Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Fri, 17 Jul 2015 19:52:29 -0500 Subject: [PATCH] XObject::StashNative --- src/xenia/kernel/xobject.cc | 10 ++-------- src/xenia/kernel/xobject.h | 13 +++++++++++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/xenia/kernel/xobject.cc b/src/xenia/kernel/xobject.cc index 1b2735625..2fb798dcd 100644 --- a/src/xenia/kernel/xobject.cc +++ b/src/xenia/kernel/xobject.cc @@ -273,10 +273,7 @@ void XObject::SetNativePointer(uint32_t native_ptr, bool uninitialized) { // Stash pointer in struct. // FIXME: This assumes the object has a dispatch header (some don't!) - uint64_t object_ptr = reinterpret_cast(this); - object_ptr |= 0x1; - header->wait_list_flink = (uint32_t)(object_ptr >> 32); - header->wait_list_blink = (uint32_t)(object_ptr & 0xFFFFFFFF); + StashNative(header, this); guest_object_ptr_ = native_ptr; } @@ -354,10 +351,7 @@ object_ref XObject::GetNativeObject(KernelState* kernel_state, // Stash pointer in struct. // FIXME: This assumes the object contains a dispatch header (some don't!) - uint64_t object_ptr = reinterpret_cast(object); - object_ptr |= 0x1; - header->wait_list_flink = (uint32_t)(object_ptr >> 32); - header->wait_list_blink = (uint32_t)(object_ptr & 0xFFFFFFFF); + StashNative(header, object); // NOTE: we are double-retaining, as the object is implicitly created and // can never be released. diff --git a/src/xenia/kernel/xobject.h b/src/xenia/kernel/xobject.h index 18cdaa71c..c9ddfd54c 100644 --- a/src/xenia/kernel/xobject.h +++ b/src/xenia/kernel/xobject.h @@ -156,6 +156,19 @@ class XObject { uint8_t* CreateNative(uint32_t size); void SetNativePointer(uint32_t native_ptr, bool uninitialized = false); + template + T* CreateNative(uint32_t size) { + return reinterpret_cast(CreateNative(size)); + } + + // Stash native pointer into X_DISPATCH_HEADER + static void StashNative(X_DISPATCH_HEADER* header, void* native_ptr) { + uint64_t object_ptr = reinterpret_cast(native_ptr); + object_ptr |= 0x1; + header->wait_list_flink = (uint32_t)(object_ptr >> 32); + header->wait_list_blink = (uint32_t)(object_ptr & 0xFFFFFFFF); + } + static uint32_t TimeoutTicksToMs(int64_t timeout_ticks); KernelState* kernel_state_;