diff options
| author | 2022-07-11 10:13:13 -0400 | |
|---|---|---|
| committer | 2022-07-14 22:47:18 -0400 | |
| commit | a9a83fa726b43a28f4e5a40516efd56fbf99009f (patch) | |
| tree | 1f9de785b3af0d31ca19aa7d5770437fe17902c1 /src | |
| parent | kernel: be more careful about initialization path for HLE threads (diff) | |
| download | yuzu-a9a83fa726b43a28f4e5a40516efd56fbf99009f.tar.gz yuzu-a9a83fa726b43a28f4e5a40516efd56fbf99009f.tar.xz yuzu-a9a83fa726b43a28f4e5a40516efd56fbf99009f.zip | |
kernel: Ensure all uses of disable_count are balanced
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/kernel/k_scheduler.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_scheduler.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 8 |
3 files changed, 21 insertions, 10 deletions
diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp index d9ba8e409..c34ce7a17 100644 --- a/src/core/hle/kernel/k_scheduler.cpp +++ b/src/core/hle/kernel/k_scheduler.cpp | |||
| @@ -63,14 +63,8 @@ void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduli | |||
| 63 | auto* scheduler{kernel.CurrentScheduler()}; | 63 | auto* scheduler{kernel.CurrentScheduler()}; |
| 64 | 64 | ||
| 65 | if (!scheduler || kernel.IsPhantomModeForSingleCore()) { | 65 | if (!scheduler || kernel.IsPhantomModeForSingleCore()) { |
| 66 | // HACK: we cannot schedule from this thread, it is not a core thread | 66 | KScheduler::RescheduleCores(kernel, cores_needing_scheduling); |
| 67 | RescheduleCores(kernel, cores_needing_scheduling); | 67 | KScheduler::RescheduleCurrentHLEThread(kernel); |
| 68 | if (GetCurrentThread(kernel).GetDisableDispatchCount() == 1) { | ||
| 69 | // Special case to ensure dummy threads that are waiting block | ||
| 70 | GetCurrentThread(kernel).IfDummyThreadTryWait(); | ||
| 71 | } | ||
| 72 | GetCurrentThread(kernel).EnableDispatch(); | ||
| 73 | ASSERT(GetCurrentThread(kernel).GetState() != ThreadState::Waiting); | ||
| 74 | return; | 68 | return; |
| 75 | } | 69 | } |
| 76 | 70 | ||
| @@ -83,6 +77,17 @@ void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduli | |||
| 83 | } | 77 | } |
| 84 | } | 78 | } |
| 85 | 79 | ||
| 80 | void KScheduler::RescheduleCurrentHLEThread(KernelCore& kernel) { | ||
| 81 | // HACK: we cannot schedule from this thread, it is not a core thread | ||
| 82 | ASSERT(GetCurrentThread(kernel).GetDisableDispatchCount() == 1); | ||
| 83 | |||
| 84 | // Special case to ensure dummy threads that are waiting block | ||
| 85 | GetCurrentThread(kernel).IfDummyThreadTryWait(); | ||
| 86 | |||
| 87 | ASSERT(GetCurrentThread(kernel).GetState() != ThreadState::Waiting); | ||
| 88 | GetCurrentThread(kernel).EnableDispatch(); | ||
| 89 | } | ||
| 90 | |||
| 86 | u64 KScheduler::UpdateHighestPriorityThreads(KernelCore& kernel) { | 91 | u64 KScheduler::UpdateHighestPriorityThreads(KernelCore& kernel) { |
| 87 | if (IsSchedulerUpdateNeeded(kernel)) { | 92 | if (IsSchedulerUpdateNeeded(kernel)) { |
| 88 | return UpdateHighestPriorityThreadsImpl(kernel); | 93 | return UpdateHighestPriorityThreadsImpl(kernel); |
diff --git a/src/core/hle/kernel/k_scheduler.h b/src/core/hle/kernel/k_scheduler.h index ac7421c9a..534321d8d 100644 --- a/src/core/hle/kernel/k_scheduler.h +++ b/src/core/hle/kernel/k_scheduler.h | |||
| @@ -119,6 +119,8 @@ private: | |||
| 119 | } | 119 | } |
| 120 | static u64 UpdateHighestPriorityThreadsImpl(KernelCore& kernel); | 120 | static u64 UpdateHighestPriorityThreadsImpl(KernelCore& kernel); |
| 121 | 121 | ||
| 122 | static void RescheduleCurrentHLEThread(KernelCore& kernel); | ||
| 123 | |||
| 122 | // Instanced private API. | 124 | // Instanced private API. |
| 123 | void ScheduleImpl(); | 125 | void ScheduleImpl(); |
| 124 | void ScheduleImplFiber(); | 126 | void ScheduleImplFiber(); |
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 985ce448e..174afc80d 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp | |||
| @@ -1106,6 +1106,8 @@ void KThread::IfDummyThreadTryWait() { | |||
| 1106 | return; | 1106 | return; |
| 1107 | } | 1107 | } |
| 1108 | 1108 | ||
| 1109 | ASSERT(!kernel.IsPhantomModeForSingleCore()); | ||
| 1110 | |||
| 1109 | // Block until we are no longer waiting. | 1111 | // Block until we are no longer waiting. |
| 1110 | std::unique_lock lk(dummy_wait_lock); | 1112 | std::unique_lock lk(dummy_wait_lock); |
| 1111 | dummy_wait_cv.wait( | 1113 | dummy_wait_cv.wait( |
| @@ -1211,10 +1213,12 @@ KScopedDisableDispatch::~KScopedDisableDispatch() { | |||
| 1211 | } | 1213 | } |
| 1212 | 1214 | ||
| 1213 | if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) { | 1215 | if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) { |
| 1214 | auto scheduler = kernel.CurrentScheduler(); | 1216 | auto* scheduler = kernel.CurrentScheduler(); |
| 1215 | 1217 | ||
| 1216 | if (scheduler) { | 1218 | if (scheduler && !kernel.IsPhantomModeForSingleCore()) { |
| 1217 | scheduler->RescheduleCurrentCore(); | 1219 | scheduler->RescheduleCurrentCore(); |
| 1220 | } else { | ||
| 1221 | KScheduler::RescheduleCurrentHLEThread(kernel); | ||
| 1218 | } | 1222 | } |
| 1219 | } else { | 1223 | } else { |
| 1220 | GetCurrentThread(kernel).EnableDispatch(); | 1224 | GetCurrentThread(kernel).EnableDispatch(); |