diff options
| author | 2018-12-02 00:44:40 -0500 | |
|---|---|---|
| committer | 2018-12-02 00:44:40 -0500 | |
| commit | 3476830b26b61410b633c827e985bffa1dc52528 (patch) | |
| tree | cedba8440c12c3d8edeb78f33de5c56f2488b60f | |
| parent | scheduler: Add explanations for YieldWith and WithoutLoadBalancing (diff) | |
| download | yuzu-3476830b26b61410b633c827e985bffa1dc52528.tar.gz yuzu-3476830b26b61410b633c827e985bffa1dc52528.tar.xz yuzu-3476830b26b61410b633c827e985bffa1dc52528.zip | |
svc: Avoid performance-degrading unnecessary reschedule
| -rw-r--r-- | src/core/hle/kernel/scheduler.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 11 |
2 files changed, 6 insertions, 8 deletions
diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp index 624c841ad..efe3551e2 100644 --- a/src/core/hle/kernel/scheduler.cpp +++ b/src/core/hle/kernel/scheduler.cpp | |||
| @@ -207,8 +207,8 @@ void Scheduler::YieldWithoutLoadBalancing(Thread* thread) { | |||
| 207 | ASSERT(thread->GetPriority() < THREADPRIO_COUNT); | 207 | ASSERT(thread->GetPriority() < THREADPRIO_COUNT); |
| 208 | 208 | ||
| 209 | // Yield this thread | 209 | // Yield this thread |
| 210 | MoveThreadToBackOfPriorityQueue(thread, thread->GetPriority()); | ||
| 211 | Reschedule(); | 210 | Reschedule(); |
| 211 | MoveThreadToBackOfPriorityQueue(thread, thread->GetPriority()); | ||
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | void Scheduler::YieldWithLoadBalancing(Thread* thread) { | 214 | void Scheduler::YieldWithLoadBalancing(Thread* thread) { |
| @@ -223,6 +223,7 @@ void Scheduler::YieldWithLoadBalancing(Thread* thread) { | |||
| 223 | ASSERT(priority < THREADPRIO_COUNT); | 223 | ASSERT(priority < THREADPRIO_COUNT); |
| 224 | 224 | ||
| 225 | // Reschedule thread to end of queue. | 225 | // Reschedule thread to end of queue. |
| 226 | Reschedule(); | ||
| 226 | MoveThreadToBackOfPriorityQueue(thread, priority); | 227 | MoveThreadToBackOfPriorityQueue(thread, priority); |
| 227 | 228 | ||
| 228 | Thread* suggested_thread = nullptr; | 229 | Thread* suggested_thread = nullptr; |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 205706033..c119f7be1 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -962,13 +962,13 @@ static void SleepThread(s64 nanoseconds) { | |||
| 962 | 962 | ||
| 963 | // Don't attempt to yield execution if there are no available threads to run, | 963 | // Don't attempt to yield execution if there are no available threads to run, |
| 964 | // this way we avoid a useless reschedule to the idle thread. | 964 | // this way we avoid a useless reschedule to the idle thread. |
| 965 | if (!Core::System::GetInstance().CurrentScheduler().HaveReadyThreads()) | 965 | if (nanoseconds <= 0 && !Core::System::GetInstance().CurrentScheduler().HaveReadyThreads()) |
| 966 | return; | 966 | return; |
| 967 | 967 | ||
| 968 | enum class SleepType : s64 { | 968 | enum class SleepType : s64 { |
| 969 | YieldWithoutLoadBalancing = 0, | 969 | YieldWithoutLoadBalancing = 0, |
| 970 | YieldWithLoadBalancing = 1, | 970 | YieldWithLoadBalancing = -1, |
| 971 | YieldAndWaitForLoadBalancing = 2, | 971 | YieldAndWaitForLoadBalancing = -2, |
| 972 | }; | 972 | }; |
| 973 | 973 | ||
| 974 | if (nanoseconds <= 0) { | 974 | if (nanoseconds <= 0) { |
| @@ -998,10 +998,7 @@ static void SleepThread(s64 nanoseconds) { | |||
| 998 | // Create an event to wake the thread up after the specified nanosecond delay has passed | 998 | // Create an event to wake the thread up after the specified nanosecond delay has passed |
| 999 | GetCurrentThread()->WakeAfterDelay(nanoseconds); | 999 | GetCurrentThread()->WakeAfterDelay(nanoseconds); |
| 1000 | 1000 | ||
| 1001 | Core::System::GetInstance().CpuCore(0).PrepareReschedule(); | 1001 | Core::System::GetInstance().PrepareReschedule(); |
| 1002 | Core::System::GetInstance().CpuCore(1).PrepareReschedule(); | ||
| 1003 | Core::System::GetInstance().CpuCore(2).PrepareReschedule(); | ||
| 1004 | Core::System::GetInstance().CpuCore(3).PrepareReschedule(); | ||
| 1005 | } | 1002 | } |
| 1006 | 1003 | ||
| 1007 | /// Wait process wide key atomic | 1004 | /// Wait process wide key atomic |