From 600c14b3f01803ea55653c59046a2250b9a0511d Mon Sep 17 00:00:00 2001 From: gibbed Date: Fri, 7 Jan 2022 09:20:09 -0600 Subject: [PATCH] [xboxknrl] Implement ExTryToAcquireRWLShared. [xboxknrl] Implement ExTryToAcquireReadWriteLockShared. --- .../kernel/xboxkrnl/xboxkrnl_threading.cc | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc index c59a21dc8..0fa37bda8 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc @@ -1236,6 +1236,26 @@ void ExAcquireReadWriteLockShared(pointer_t lock_ptr) { DECLARE_XBOXKRNL_EXPORT2(ExAcquireReadWriteLockShared, kThreading, kImplemented, kBlocking); +dword_result_t ExTryToAcquireReadWriteLockShared( + pointer_t lock_ptr) { + auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock); + + uint32_t result; + if (lock_ptr->lock_count < 0 || + (lock_ptr->readers_entry_count && !lock_ptr->writers_waiting_count)) { + lock_ptr->lock_count++; + lock_ptr->readers_entry_count++; + result = 1; + } else { + result = 0; + } + + xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql); + return result; +} +DECLARE_XBOXKRNL_EXPORT1(ExTryToAcquireReadWriteLockShared, kThreading, + kImplemented); + void ExReleaseReadWriteLock(pointer_t lock_ptr) { auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);