diff options
| author | 2020-02-14 11:44:31 -0400 | |
|---|---|---|
| committer | 2020-02-22 11:18:07 -0400 | |
| commit | ea956c823e5e6b7f6fd16780b613263d6fadd5da (patch) | |
| tree | c5ce0c9e42f30b6342c064c50b0c712bf05cf5b0 /src/core/hle/kernel/scheduler.h | |
| parent | Kernel: Implement Time Manager. (diff) | |
| download | yuzu-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.h | 41 |
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 | ||
| 23 | class KernelCore; | 24 | class KernelCore; |
| 24 | class Process; | 25 | class Process; |
| 26 | class SchedulerLock; | ||
| 25 | 27 | ||
| 26 | class GlobalScheduler final { | 28 | class GlobalScheduler final { |
| 27 | public: | 29 | public: |
| @@ -139,6 +141,14 @@ public: | |||
| 139 | void Shutdown(); | 141 | void Shutdown(); |
| 140 | 142 | ||
| 141 | private: | 143 | private: |
| 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 | ||
| 246 | class SchedulerLock { | ||
| 247 | public: | ||
| 248 | SchedulerLock(KernelCore& kernel); | ||
| 249 | ~SchedulerLock(); | ||
| 250 | |||
| 251 | protected: | ||
| 252 | KernelCore& kernel; | ||
| 253 | }; | ||
| 254 | |||
| 255 | class SchedulerLockAndSleep : public SchedulerLock { | ||
| 256 | public: | ||
| 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 | |||
| 265 | private: | ||
| 266 | Handle& event_handle; | ||
| 267 | Thread* time_task; | ||
| 268 | s64 nanoseconds; | ||
| 269 | bool sleep_cancelled{}; | ||
| 270 | }; | ||
| 271 | |||
| 231 | } // namespace Kernel | 272 | } // namespace Kernel |