From ebdbaa6db05057a5747cc96849922135a8b07994 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Tue, 11 May 2021 13:18:50 -0300 Subject: [PATCH] Fix a specific core migration bug on the scheduler (#2271) --- .../HOS/Kernel/Threading/KScheduler.cs | 57 ++++++++++++------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs index e427f24db..0982ceffb 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs @@ -22,8 +22,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading private struct SchedulingState { - public bool NeedsScheduling; - public KThread SelectedThread; + public volatile bool NeedsScheduling; + public volatile KThread SelectedThread; } private SchedulingState _state; @@ -349,31 +349,29 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading nextThread ??= _idleThread; - if (currentThread == nextThread) + if (currentThread != nextThread) { - return; - } + long previousTicks = LastContextSwitchTime; + long currentTicks = PerformanceCounter.ElapsedTicks; + long ticksDelta = currentTicks - previousTicks; - long previousTicks = LastContextSwitchTime; - long currentTicks = PerformanceCounter.ElapsedTicks; - long ticksDelta = currentTicks - previousTicks; + currentThread.AddCpuTime(ticksDelta); - currentThread.AddCpuTime(ticksDelta); + if (currentProcess != null) + { + currentProcess.AddCpuTime(ticksDelta); + } - if (currentProcess != null) - { - currentProcess.AddCpuTime(ticksDelta); - } + LastContextSwitchTime = currentTicks; - LastContextSwitchTime = currentTicks; - - if (currentProcess != null) - { - _previousThread = !currentThread.TerminationRequested && currentThread.ActiveCore == _coreId ? currentThread : null; - } - else if (currentThread == _idleThread) - { - _previousThread = null; + if (currentProcess != null) + { + _previousThread = !currentThread.TerminationRequested && currentThread.ActiveCore == _coreId ? currentThread : null; + } + else if (currentThread == _idleThread) + { + _previousThread = null; + } } if (nextThread.CurrentCore != _coreId) @@ -469,6 +467,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { KThread currentThread = KernelStatic.GetCurrentThread(); + if (!currentThread.IsSchedulable) + { + return; + } + context.CriticalSection.Enter(); if (currentThread.SchedFlags != ThreadSchedState.Running) @@ -491,6 +494,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { KThread currentThread = KernelStatic.GetCurrentThread(); + if (!currentThread.IsSchedulable) + { + return; + } + context.CriticalSection.Enter(); if (currentThread.SchedFlags != ThreadSchedState.Running) @@ -550,6 +558,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { KThread currentThread = KernelStatic.GetCurrentThread(); + if (!currentThread.IsSchedulable) + { + return; + } + context.CriticalSection.Enter(); if (currentThread.SchedFlags != ThreadSchedState.Running)