Quellcode durchsuchen

svc: Avoid performance-degrading unnecessary reschedule

Zach Hilman vor 7 Jahren
Ursprung
Commit
3476830b26
2 geänderte Dateien mit 6 neuen und 8 gelöschten Zeilen
  1. 2 1
      src/core/hle/kernel/scheduler.cpp
  2. 4 7
      src/core/hle/kernel/svc.cpp

+ 2 - 1
src/core/hle/kernel/scheduler.cpp

@@ -207,8 +207,8 @@ void Scheduler::YieldWithoutLoadBalancing(Thread* thread) {
     ASSERT(thread->GetPriority() < THREADPRIO_COUNT);
     ASSERT(thread->GetPriority() < THREADPRIO_COUNT);
 
 
     // Yield this thread
     // Yield this thread
-    MoveThreadToBackOfPriorityQueue(thread, thread->GetPriority());
     Reschedule();
     Reschedule();
+    MoveThreadToBackOfPriorityQueue(thread, thread->GetPriority());
 }
 }
 
 
 void Scheduler::YieldWithLoadBalancing(Thread* thread) {
 void Scheduler::YieldWithLoadBalancing(Thread* thread) {
@@ -223,6 +223,7 @@ void Scheduler::YieldWithLoadBalancing(Thread* thread) {
     ASSERT(priority < THREADPRIO_COUNT);
     ASSERT(priority < THREADPRIO_COUNT);
 
 
     // Reschedule thread to end of queue.
     // Reschedule thread to end of queue.
+    Reschedule();
     MoveThreadToBackOfPriorityQueue(thread, priority);
     MoveThreadToBackOfPriorityQueue(thread, priority);
 
 
     Thread* suggested_thread = nullptr;
     Thread* suggested_thread = nullptr;

+ 4 - 7
src/core/hle/kernel/svc.cpp

@@ -962,13 +962,13 @@ static void SleepThread(s64 nanoseconds) {
 
 
     // Don't attempt to yield execution if there are no available threads to run,
     // Don't attempt to yield execution if there are no available threads to run,
     // this way we avoid a useless reschedule to the idle thread.
     // this way we avoid a useless reschedule to the idle thread.
-    if (!Core::System::GetInstance().CurrentScheduler().HaveReadyThreads())
+    if (nanoseconds <= 0 && !Core::System::GetInstance().CurrentScheduler().HaveReadyThreads())
         return;
         return;
 
 
     enum class SleepType : s64 {
     enum class SleepType : s64 {
         YieldWithoutLoadBalancing = 0,
         YieldWithoutLoadBalancing = 0,
-        YieldWithLoadBalancing = 1,
-        YieldAndWaitForLoadBalancing = 2,
+        YieldWithLoadBalancing = -1,
+        YieldAndWaitForLoadBalancing = -2,
     };
     };
 
 
     if (nanoseconds <= 0) {
     if (nanoseconds <= 0) {
@@ -998,10 +998,7 @@ static void SleepThread(s64 nanoseconds) {
     // Create an event to wake the thread up after the specified nanosecond delay has passed
     // Create an event to wake the thread up after the specified nanosecond delay has passed
     GetCurrentThread()->WakeAfterDelay(nanoseconds);
     GetCurrentThread()->WakeAfterDelay(nanoseconds);
 
 
-    Core::System::GetInstance().CpuCore(0).PrepareReschedule();
-    Core::System::GetInstance().CpuCore(1).PrepareReschedule();
-    Core::System::GetInstance().CpuCore(2).PrepareReschedule();
-    Core::System::GetInstance().CpuCore(3).PrepareReschedule();
+    Core::System::GetInstance().PrepareReschedule();
 }
 }
 
 
 /// Wait process wide key atomic
 /// Wait process wide key atomic