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,11 +349,8 @@ 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;
@ -375,6 +372,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{
_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)