summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/k_light_condition_variable.h
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-11-10 05:54:44 +0100
committerbunnei <bunneidev@gmail.com>2021-12-07 01:39:17 +0100
commit5dff28290fc4fc9bc3db3c32476dd93b2c4414c6 (patch)
tree45bccef430ad51ccef88b66036f511d8f52964d0 /src/core/hle/kernel/k_light_condition_variable.h
parenthle: kernel: KLightLock: Migrate to updated KThreadQueue. (diff)
downloadyuzu-5dff28290fc4fc9bc3db3c32476dd93b2c4414c6.tar
yuzu-5dff28290fc4fc9bc3db3c32476dd93b2c4414c6.tar.gz
yuzu-5dff28290fc4fc9bc3db3c32476dd93b2c4414c6.tar.bz2
yuzu-5dff28290fc4fc9bc3db3c32476dd93b2c4414c6.tar.lz
yuzu-5dff28290fc4fc9bc3db3c32476dd93b2c4414c6.tar.xz
yuzu-5dff28290fc4fc9bc3db3c32476dd93b2c4414c6.tar.zst
yuzu-5dff28290fc4fc9bc3db3c32476dd93b2c4414c6.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/k_light_condition_variable.h60
1 files changed, 6 insertions, 54 deletions
diff --git a/src/core/hle/kernel/k_light_condition_variable.h b/src/core/hle/kernel/k_light_condition_variable.h
index fb0ad783a..65d3bc3e1 100644
--- a/src/core/hle/kernel/k_light_condition_variable.h
+++ b/src/core/hle/kernel/k_light_condition_variable.h
@@ -1,73 +1,25 @@
-// Copyright 2020 yuzu Emulator Project
+// Copyright 2021 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-// This file references various implementation details from Atmosphere, an open-source firmware for
-// the Nintendo Switch. Copyright 2018-2020 Atmosphere-NX.
-
#pragma once
#include "common/common_types.h"
-#include "core/hle/kernel/k_scheduler.h"
-#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
-#include "core/hle/kernel/time_manager.h"
+#include "core/hle/kernel/k_thread.h"
namespace Kernel {
+
class KernelCore;
+class KLightLock;
class KLightConditionVariable {
public:
explicit KLightConditionVariable(KernelCore& kernel_) : kernel{kernel_} {}
- void Wait(KLightLock* lock, s64 timeout = -1, bool allow_terminating_thread = true) {
- WaitImpl(lock, timeout, allow_terminating_thread);
- }
-
- void Broadcast() {
- KScopedSchedulerLock lk{kernel};
-
- // Signal all threads.
- for (auto& thread : wait_list) {
- thread.SetState(ThreadState::Runnable);
- }
- }
+ void Wait(KLightLock* lock, s64 timeout = -1, bool allow_terminating_thread = true);
+ void Broadcast();
private:
- void WaitImpl(KLightLock* lock, s64 timeout, bool allow_terminating_thread) {
- KThread* owner = GetCurrentThreadPointer(kernel);
-
- // Sleep the thread.
- {
- KScopedSchedulerLockAndSleep lk{kernel, owner, timeout};
-
- if (!allow_terminating_thread && owner->IsTerminationRequested()) {
- lk.CancelSleep();
- return;
- }
-
- lock->Unlock();
-
- // Set the thread as waiting.
- GetCurrentThread(kernel).SetState(ThreadState::Waiting);
-
- // Add the thread to the queue.
- wait_list.push_back(GetCurrentThread(kernel));
- }
-
- // Remove the thread from the wait list.
- {
- KScopedSchedulerLock sl{kernel};
-
- wait_list.erase(wait_list.iterator_to(GetCurrentThread(kernel)));
- }
-
- // Cancel the task that the sleep setup.
- kernel.TimeManager().UnscheduleTimeEvent(owner);
-
- // Re-acquire the lock.
- lock->Lock();
- }
-
KernelCore& kernel;
KThread::WaiterList wait_list{};
};