From 11a380c3dae0ac5a419d91dc41a5aa32c4c72868 Mon Sep 17 00:00:00 2001 From: bunnei Date: Mon, 17 Jan 2022 16:44:14 -0800 Subject: hle: kernel: KScheduler: Ensure dummy threads are never scheduled. - These are only used by host threads for locking. --- src/core/hle/kernel/k_scheduler.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/core/hle/kernel/k_scheduler.cpp') diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp index f900b2e7a..5d39a1d4a 100644 --- a/src/core/hle/kernel/k_scheduler.cpp +++ b/src/core/hle/kernel/k_scheduler.cpp @@ -739,6 +739,11 @@ void KScheduler::ScheduleImpl() { next_thread = idle_thread; } + // We never want to schedule a dummy thread, as these are only used by host threads for locking. + if (next_thread->GetThreadType() == ThreadType::Dummy) { + next_thread = idle_thread; + } + // If we're not actually switching thread, there's nothing to do. if (next_thread == current_thread.load()) { previous_thread->EnableDispatch(); -- cgit v1.2.3 From 46a620f9d7c0fa2a4f1143ebf28bba4fee12d1a1 Mon Sep 17 00:00:00 2001 From: bunnei Date: Mon, 17 Jan 2022 18:48:14 -0800 Subject: hle: kernel: KThread: Decrease DummyThread priority to ensure it is never scheduled. --- src/core/hle/kernel/k_scheduler.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/core/hle/kernel/k_scheduler.cpp') diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp index 5d39a1d4a..1b2a01869 100644 --- a/src/core/hle/kernel/k_scheduler.cpp +++ b/src/core/hle/kernel/k_scheduler.cpp @@ -741,6 +741,7 @@ void KScheduler::ScheduleImpl() { // We never want to schedule a dummy thread, as these are only used by host threads for locking. if (next_thread->GetThreadType() == ThreadType::Dummy) { + ASSERT_MSG(false, "Dummy threads should never be scheduled!"); next_thread = idle_thread; } -- cgit v1.2.3 From 615fb40416b9ee10abf40a036b31d1540886a9b8 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 21 Jan 2022 17:10:11 -0800 Subject: hle: kernel: KThread: Ensure host (dummy) threads block on locking. - But do not enter the priority queue, as otherwise they will be scheduled. - Allows dummy threads to use guest synchronization primitives. --- src/core/hle/kernel/k_scheduler.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/core/hle/kernel/k_scheduler.cpp') diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp index 1b2a01869..b32d4f285 100644 --- a/src/core/hle/kernel/k_scheduler.cpp +++ b/src/core/hle/kernel/k_scheduler.cpp @@ -406,6 +406,9 @@ void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduli } else { RescheduleCores(kernel, cores_needing_scheduling); } + + // Special case to ensure dummy threads that are waiting block. + current_thread->IfDummyThreadTryWait(); } u64 KScheduler::UpdateHighestPriorityThreads(KernelCore& kernel) { -- cgit v1.2.3