diff options
author | Liam <byteslice@airmail.cc> | 2022-10-23 11:24:38 +0200 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2022-10-25 01:52:01 +0200 |
commit | 1a378a776902e1142b907110c6dd3a3a1647d328 (patch) | |
tree | 7b431310dfc5331f601076b3dd11d76d66f89f02 /src/core/hle/kernel/k_scheduler.cpp | |
parent | Merge pull request #9095 from FernandoS27/meat-good-vegetable-bad (diff) | |
download | yuzu-1a378a776902e1142b907110c6dd3a3a1647d328.tar yuzu-1a378a776902e1142b907110c6dd3a3a1647d328.tar.gz yuzu-1a378a776902e1142b907110c6dd3a3a1647d328.tar.bz2 yuzu-1a378a776902e1142b907110c6dd3a3a1647d328.tar.lz yuzu-1a378a776902e1142b907110c6dd3a3a1647d328.tar.xz yuzu-1a378a776902e1142b907110c6dd3a3a1647d328.tar.zst yuzu-1a378a776902e1142b907110c6dd3a3a1647d328.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/kernel/k_scheduler.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp index c34ce7a17..b1cabbca0 100644 --- a/src/core/hle/kernel/k_scheduler.cpp +++ b/src/core/hle/kernel/k_scheduler.cpp @@ -81,8 +81,8 @@ void KScheduler::RescheduleCurrentHLEThread(KernelCore& kernel) { // HACK: we cannot schedule from this thread, it is not a core thread ASSERT(GetCurrentThread(kernel).GetDisableDispatchCount() == 1); - // Special case to ensure dummy threads that are waiting block - GetCurrentThread(kernel).IfDummyThreadTryWait(); + // Ensure dummy threads that are waiting block. + GetCurrentThread(kernel).DummyThreadBeginWait(); ASSERT(GetCurrentThread(kernel).GetState() != ThreadState::Waiting); GetCurrentThread(kernel).EnableDispatch(); @@ -314,6 +314,16 @@ u64 KScheduler::UpdateHighestPriorityThreadsImpl(KernelCore& kernel) { idle_cores &= ~(1ULL << core_id); } + // HACK: any waiting dummy threads can wake up now. + kernel.GlobalSchedulerContext().WakeupWaitingDummyThreads(); + + // HACK: if we are a dummy thread, and we need to go sleep, indicate + // that for when the lock is released. + KThread* const cur_thread = GetCurrentThreadPointer(kernel); + if (cur_thread->IsDummyThread() && cur_thread->GetState() != ThreadState::Runnable) { + cur_thread->RequestDummyThreadWait(); + } + return cores_needing_scheduling; } @@ -531,11 +541,23 @@ void KScheduler::OnThreadStateChanged(KernelCore& kernel, KThread* thread, Threa GetPriorityQueue(kernel).Remove(thread); IncrementScheduledCount(thread); SetSchedulerUpdateNeeded(kernel); + + if (thread->IsDummyThread()) { + // HACK: if this is a dummy thread, it should no longer wake up when the + // scheduler lock is released. + kernel.GlobalSchedulerContext().UnregisterDummyThreadForWakeup(thread); + } } else if (cur_state == ThreadState::Runnable) { // If we're now runnable, then we weren't previously, and we should add. GetPriorityQueue(kernel).PushBack(thread); IncrementScheduledCount(thread); SetSchedulerUpdateNeeded(kernel); + + if (thread->IsDummyThread()) { + // HACK: if this is a dummy thread, it should wake up when the scheduler + // lock is released. + kernel.GlobalSchedulerContext().RegisterDummyThreadForWakeup(thread); + } } } |