summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/scheduler.cpp
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-09-10 11:04:40 -0400
committerGravatar FernandoS272019-10-15 11:55:14 -0400
commitb49c0dab8772afb06358e5d19af092226b3a59bb (patch)
tree00e1cad505f915f5d7d286c5627b8e13f5eb78ff /src/core/hle/kernel/scheduler.cpp
parentScheduler: Add protections for Yield bombing (diff)
downloadyuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.tar.gz
yuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.tar.xz
yuzu-b49c0dab8772afb06358e5d19af092226b3a59bb.zip
Kernel: Initial implementation of thread preemption.
Diffstat (limited to 'src/core/hle/kernel/scheduler.cpp')
-rw-r--r--src/core/hle/kernel/scheduler.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp
index 451fd8077..0d45307cd 100644
--- a/src/core/hle/kernel/scheduler.cpp
+++ b/src/core/hle/kernel/scheduler.cpp
@@ -238,6 +238,16 @@ bool GlobalScheduler::YieldThreadAndWaitForLoadBalancing(Thread* yielding_thread
238 return AskForReselectionOrMarkRedundant(yielding_thread, winner); 238 return AskForReselectionOrMarkRedundant(yielding_thread, winner);
239} 239}
240 240
241void GlobalScheduler::PreemptThreads() {
242 for (std::size_t core_id = 0; core_id < NUM_CPU_CORES; core_id++) {
243 const u64 priority = preemption_priorities[core_id];
244 if (scheduled_queue[core_id].size(priority) > 1) {
245 scheduled_queue[core_id].yield(priority);
246 reselection_pending.store(true, std::memory_order_release);
247 }
248 }
249}
250
241void GlobalScheduler::Schedule(u32 priority, u32 core, Thread* thread) { 251void GlobalScheduler::Schedule(u32 priority, u32 core, Thread* thread) {
242 ASSERT_MSG(thread->GetProcessorID() == core, "Thread must be assigned to this core."); 252 ASSERT_MSG(thread->GetProcessorID() == core, "Thread must be assigned to this core.");
243 scheduled_queue[core].add(thread, priority); 253 scheduled_queue[core].add(thread, priority);