From 9b9ead94cd2f25a85468ecf91b7898bf34e10825 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Tue, 15 May 2018 23:49:57 -0300 Subject: Only use higher priority on yield, change reschedule to be per-thread instead of using SchedulerThread to store the reschedule flag --- Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs') diff --git a/Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs b/Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs index f27455b9..c1c10314 100644 --- a/Ryujinx.Core/OsHle/Handles/KProcessScheduler.cs +++ b/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); } } -- cgit v1.2.3