diff options
author | bunnei <bunneidev@gmail.com> | 2021-12-06 08:36:15 +0100 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2021-12-07 01:39:18 +0100 |
commit | e596fac6ee174d9e232c1a2291dfb8e8b5825aba (patch) | |
tree | 9daa608797871adac65c1c87dad23d6de55fdc4e /src | |
parent | hle: kernel: service_thread: Use std::jthread. (diff) | |
download | yuzu-e596fac6ee174d9e232c1a2291dfb8e8b5825aba.tar yuzu-e596fac6ee174d9e232c1a2291dfb8e8b5825aba.tar.gz yuzu-e596fac6ee174d9e232c1a2291dfb8e8b5825aba.tar.bz2 yuzu-e596fac6ee174d9e232c1a2291dfb8e8b5825aba.tar.lz yuzu-e596fac6ee174d9e232c1a2291dfb8e8b5825aba.tar.xz yuzu-e596fac6ee174d9e232c1a2291dfb8e8b5825aba.tar.zst yuzu-e596fac6ee174d9e232c1a2291dfb8e8b5825aba.zip |
Diffstat (limited to 'src')
-rw-r--r-- | src/core/hle/kernel/k_light_lock.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/core/hle/kernel/k_light_lock.cpp b/src/core/hle/kernel/k_light_lock.cpp index 5e8f1a510..9830506ff 100644 --- a/src/core/hle/kernel/k_light_lock.cpp +++ b/src/core/hle/kernel/k_light_lock.cpp @@ -16,10 +16,15 @@ class ThreadQueueImplForKLightLock final : public KThreadQueue { public: explicit ThreadQueueImplForKLightLock(KernelCore& kernel_) : KThreadQueue(kernel_) {} - virtual void CancelWait([[maybe_unused]] KThread* waiting_thread, - [[maybe_unused]] ResultCode wait_result, - [[maybe_unused]] bool cancel_timer_task) override { - // Do nothing, waiting to acquire a light lock cannot be canceled. + virtual void CancelWait(KThread* waiting_thread, ResultCode wait_result, + bool cancel_timer_task) override { + // Remove the thread as a waiter from its owner. + if (KThread* owner = waiting_thread->GetLockOwner(); owner != nullptr) { + owner->RemoveWaiter(waiting_thread); + } + + // Invoke the base cancel wait handler. + KThreadQueue::CancelWait(waiting_thread, wait_result, cancel_timer_task); } }; @@ -64,7 +69,7 @@ bool KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) { } // Add the current thread as a waiter on the owner. - KThread* owner_thread = reinterpret_cast<KThread*>(_owner & ~1ul); + KThread* owner_thread = reinterpret_cast<KThread*>(_owner & ~1ULL); cur_thread->SetAddressKey(reinterpret_cast<uintptr_t>(std::addressof(tag))); owner_thread->AddWaiter(cur_thread); |