diff options
author | bunnei <bunneidev@gmail.com> | 2022-10-26 18:51:44 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-26 18:51:44 +0200 |
commit | 2dd6a2352d030230f08b045a21e529ea8f06cf97 (patch) | |
tree | 912bff09ece8da0ade954056bf9ecb3e6ddee673 /src/core/hle/kernel/k_scheduler.cpp | |
parent | Merge pull request #9131 from Morph1984/contiguous (diff) | |
parent | kernel: refactor dummy thread wakeups (diff) | |
download | yuzu-2dd6a2352d030230f08b045a21e529ea8f06cf97.tar yuzu-2dd6a2352d030230f08b045a21e529ea8f06cf97.tar.gz yuzu-2dd6a2352d030230f08b045a21e529ea8f06cf97.tar.bz2 yuzu-2dd6a2352d030230f08b045a21e529ea8f06cf97.tar.lz yuzu-2dd6a2352d030230f08b045a21e529ea8f06cf97.tar.xz yuzu-2dd6a2352d030230f08b045a21e529ea8f06cf97.tar.zst yuzu-2dd6a2352d030230f08b045a21e529ea8f06cf97.zip |
Diffstat (limited to 'src/core/hle/kernel/k_scheduler.cpp')
-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); + } } } |