Просмотр исходного кода

Only use higher priority on yield, change reschedule to be per-thread instead of using SchedulerThread to store the reschedule flag

gdkchan 8 лет назад
Родитель
Сommit
9b9ead94cd

+ 12 - 13
Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs

@@ -13,6 +13,8 @@ namespace Ryujinx.Core.OsHle.Handles
 
         private KThread[] CoreThreads;
 
+        private bool[] CoreReschedule;
+
         private object SchedLock;
 
         private Logger Log;
@@ -27,6 +29,8 @@ namespace Ryujinx.Core.OsHle.Handles
 
             CoreThreads = new KThread[4];
 
+            CoreReschedule = new bool[4];
+
             SchedLock = new object();
         }
 
@@ -147,10 +151,10 @@ namespace Ryujinx.Core.OsHle.Handles
             {
                 PrintDbgThreadInfo(Thread, "suspended.");
 
-                AllThreads[Thread].NeedsReschedule = false;
-
                 int ActualCore = Thread.ActualCore;
 
+                CoreReschedule[ActualCore] = false;
+
                 SchedulerThread SchedThread = WaitingToRun.Pop(ActualCore);
 
                 if (SchedThread != null)
@@ -174,26 +178,21 @@ namespace Ryujinx.Core.OsHle.Handles
         {
             lock (SchedLock)
             {
-                KThread Thread = CoreThreads[Core];
-
-                if (Thread != null && AllThreads.TryGetValue(Thread, out SchedulerThread SchedThread))
-                {
-                    SchedThread.NeedsReschedule = true;
-                }
+                CoreReschedule[Core] = true;
             }
         }
 
         public void Reschedule(KThread Thread)
         {
-            SchedulerThread SchedThread = AllThreads[Thread];
-
             bool NeedsReschedule;
 
             lock (SchedLock)
             {
-                NeedsReschedule = SchedThread.NeedsReschedule;
+                int ActualCore = Thread.ActualCore;
+
+                NeedsReschedule = CoreReschedule[ActualCore];
 
-                SchedThread.NeedsReschedule = false;
+                CoreReschedule[ActualCore] = false;
             }
 
             if (NeedsReschedule)
@@ -220,7 +219,7 @@ namespace Ryujinx.Core.OsHle.Handles
                     RunThread(NewThread);
                 }
 
-                TryResumingExecution(SchedThread);
+                Resume(Thread);
             }
         }
 

+ 0 - 2
Ryujinx.Core/OsHle/Handles/SchedulerThread.cs

@@ -11,8 +11,6 @@ namespace Ryujinx.Core.OsHle.Handles
 
         public bool IsActive { get; set; }
 
-        public bool NeedsReschedule { get; set; }
-
         public AutoResetEvent   WaitSync     { get; private set; }
         public ManualResetEvent WaitActivity { get; private set; }
         public AutoResetEvent   WaitSched    { get; private set; }

+ 1 - 1
Ryujinx.Core/OsHle/Handles/ThreadQueue.cs

@@ -63,7 +63,7 @@ namespace Ryujinx.Core.OsHle.Handles
                 {
                     KThread Thread = Curr.Thread;
 
-                    if (Thread.ActualPriority <= MinPriority && (Thread.CoreMask & CoreMask) != 0)
+                    if (Thread.ActualPriority < MinPriority && (Thread.CoreMask & CoreMask) != 0)
                     {
                         if (Prev != null)
                         {

+ 0 - 1
Ryujinx.Core/OsHle/Kernel/SvcThreadSync.cs

@@ -217,7 +217,6 @@ namespace Ryujinx.Core.OsHle.Kernel
                     UpdateMutexOwner(CurrThread, OwnerThread, MutexAddress);
 
                     CurrThread.UpdatePriority();
-                    OwnerThread.UpdatePriority();
 
                     int HasListeners = OwnerThread.MutexWaiters.Count > 0 ? MutexHasListenersMask : 0;