summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/scheduler.h
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-02-14 11:44:31 -0400
committerGravatar FernandoS272020-02-22 11:18:07 -0400
commitea956c823e5e6b7f6fd16780b613263d6fadd5da (patch)
treec5ce0c9e42f30b6342c064c50b0c712bf05cf5b0 /src/core/hle/kernel/scheduler.h
parentKernel: Implement Time Manager. (diff)
downloadyuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.tar.gz
yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.tar.xz
yuzu-ea956c823e5e6b7f6fd16780b613263d6fadd5da.zip
Kernel: Implement Scheduler locks
Diffstat (limited to 'src/core/hle/kernel/scheduler.h')
-rw-r--r--src/core/hle/kernel/scheduler.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/core/hle/kernel/scheduler.h b/src/core/hle/kernel/scheduler.h
index 283236d4c..a779bb70f 100644
--- a/src/core/hle/kernel/scheduler.h
+++ b/src/core/hle/kernel/scheduler.h
@@ -6,6 +6,7 @@
6 6
7#include <atomic> 7#include <atomic>
8#include <memory> 8#include <memory>
9#include <mutex>
9#include <vector> 10#include <vector>
10 11
11#include "common/common_types.h" 12#include "common/common_types.h"
@@ -22,6 +23,7 @@ namespace Kernel {
22 23
23class KernelCore; 24class KernelCore;
24class Process; 25class Process;
26class SchedulerLock;
25 27
26class GlobalScheduler final { 28class GlobalScheduler final {
27public: 29public:
@@ -139,6 +141,14 @@ public:
139 void Shutdown(); 141 void Shutdown();
140 142
141private: 143private:
144 friend class SchedulerLock;
145
146 /// Lock the scheduler to the current thread.
147 void Lock();
148
149 /// Unlocks the scheduler, reselects threads, interrupts cores for rescheduling
150 /// and reschedules current core if needed.
151 void Unlock();
142 /** 152 /**
143 * Transfers a thread into an specific core. If the destination_core is -1 153 * Transfers a thread into an specific core. If the destination_core is -1
144 * it will be unscheduled from its source code and added into its suggested 154 * it will be unscheduled from its source code and added into its suggested
@@ -159,6 +169,11 @@ private:
159 // ordered from Core 0 to Core 3. 169 // ordered from Core 0 to Core 3.
160 std::array<u32, Core::Hardware::NUM_CPU_CORES> preemption_priorities = {59, 59, 59, 62}; 170 std::array<u32, Core::Hardware::NUM_CPU_CORES> preemption_priorities = {59, 59, 59, 62};
161 171
172 /// Scheduler lock mechanisms.
173 std::mutex inner_lock{}; // TODO(Blinkhawk): Replace for a SpinLock
174 std::atomic<std::size_t> scope_lock{};
175 Core::EmuThreadHandle current_owner{Core::EmuThreadHandle::InvalidHandle()};
176
162 /// Lists all thread ids that aren't deleted/etc. 177 /// Lists all thread ids that aren't deleted/etc.
163 std::vector<std::shared_ptr<Thread>> thread_list; 178 std::vector<std::shared_ptr<Thread>> thread_list;
164 KernelCore& kernel; 179 KernelCore& kernel;
@@ -228,4 +243,30 @@ private:
228 bool is_context_switch_pending = false; 243 bool is_context_switch_pending = false;
229}; 244};
230 245
246class SchedulerLock {
247public:
248 SchedulerLock(KernelCore& kernel);
249 ~SchedulerLock();
250
251protected:
252 KernelCore& kernel;
253};
254
255class SchedulerLockAndSleep : public SchedulerLock {
256public:
257 SchedulerLockAndSleep(KernelCore& kernel, Handle& event_handle, Thread* time_task,
258 s64 nanoseconds);
259 ~SchedulerLockAndSleep();
260
261 void CancelSleep() {
262 sleep_cancelled = true;
263 }
264
265private:
266 Handle& event_handle;
267 Thread* time_task;
268 s64 nanoseconds;
269 bool sleep_cancelled{};
270};
271
231} // namespace Kernel 272} // namespace Kernel