diff options
| author | 2020-03-12 19:53:54 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:35:49 -0400 | |
| commit | db68fba4a634ab6127ed485f55c41b5e1a05bc10 (patch) | |
| tree | aa7ce194061f472e313bd819e0d6402eb1cf1f58 /src/core/hle/kernel/scheduler.cpp | |
| parent | General: Fix microprofile on dynarmic/svc, fix wait tree showing which thread... (diff) | |
| download | yuzu-db68fba4a634ab6127ed485f55c41b5e1a05bc10.tar.gz yuzu-db68fba4a634ab6127ed485f55c41b5e1a05bc10.tar.xz yuzu-db68fba4a634ab6127ed485f55c41b5e1a05bc10.zip | |
Scheduler: Correct yielding interaction with SetThreadActivity.
Diffstat (limited to 'src/core/hle/kernel/scheduler.cpp')
| -rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index 2ad380b17..8d56b49ce 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/src/core/hle/kernel/scheduler.cpp | |||
| @@ -144,6 +144,11 @@ u32 GlobalScheduler::SelectThreads() { | |||
| 144 | bool GlobalScheduler::YieldThread(Thread* yielding_thread) { | 144 | bool GlobalScheduler::YieldThread(Thread* yielding_thread) { |
| 145 | ASSERT(is_locked); | 145 | ASSERT(is_locked); |
| 146 | // Note: caller should use critical section, etc. | 146 | // Note: caller should use critical section, etc. |
| 147 | if (!yielding_thread->IsRunnable()) { | ||
| 148 | // Normally this case shouldn't happen except for SetThreadActivity. | ||
| 149 | is_reselection_pending.store(true, std::memory_order_release); | ||
| 150 | return false; | ||
| 151 | } | ||
| 147 | const u32 core_id = static_cast<u32>(yielding_thread->GetProcessorID()); | 152 | const u32 core_id = static_cast<u32>(yielding_thread->GetProcessorID()); |
| 148 | const u32 priority = yielding_thread->GetPriority(); | 153 | const u32 priority = yielding_thread->GetPriority(); |
| 149 | 154 | ||
| @@ -161,6 +166,11 @@ bool GlobalScheduler::YieldThreadAndBalanceLoad(Thread* yielding_thread) { | |||
| 161 | ASSERT(is_locked); | 166 | ASSERT(is_locked); |
| 162 | // Note: caller should check if !thread.IsSchedulerOperationRedundant and use critical section, | 167 | // Note: caller should check if !thread.IsSchedulerOperationRedundant and use critical section, |
| 163 | // etc. | 168 | // etc. |
| 169 | if (!yielding_thread->IsRunnable()) { | ||
| 170 | // Normally this case shouldn't happen except for SetThreadActivity. | ||
| 171 | is_reselection_pending.store(true, std::memory_order_release); | ||
| 172 | return false; | ||
| 173 | } | ||
| 164 | const u32 core_id = static_cast<u32>(yielding_thread->GetProcessorID()); | 174 | const u32 core_id = static_cast<u32>(yielding_thread->GetProcessorID()); |
| 165 | const u32 priority = yielding_thread->GetPriority(); | 175 | const u32 priority = yielding_thread->GetPriority(); |
| 166 | 176 | ||
| @@ -212,6 +222,11 @@ bool GlobalScheduler::YieldThreadAndWaitForLoadBalancing(Thread* yielding_thread | |||
| 212 | ASSERT(is_locked); | 222 | ASSERT(is_locked); |
| 213 | // Note: caller should check if !thread.IsSchedulerOperationRedundant and use critical section, | 223 | // Note: caller should check if !thread.IsSchedulerOperationRedundant and use critical section, |
| 214 | // etc. | 224 | // etc. |
| 225 | if (!yielding_thread->IsRunnable()) { | ||
| 226 | // Normally this case shouldn't happen except for SetThreadActivity. | ||
| 227 | is_reselection_pending.store(true, std::memory_order_release); | ||
| 228 | return false; | ||
| 229 | } | ||
| 215 | Thread* winner = nullptr; | 230 | Thread* winner = nullptr; |
| 216 | const u32 core_id = static_cast<u32>(yielding_thread->GetProcessorID()); | 231 | const u32 core_id = static_cast<u32>(yielding_thread->GetProcessorID()); |
| 217 | 232 | ||