Fix a specific core migration bug on the scheduler (#2271)

This commit is contained in:
gdkchan 2021-05-11 13:18:50 -03:00 committed by GitHub
parent 701c427659
commit ebdbaa6db0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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)