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 private struct SchedulingState
{ {
public bool NeedsScheduling; public volatile bool NeedsScheduling;
public KThread SelectedThread; public volatile KThread SelectedThread;
} }
private SchedulingState _state; private SchedulingState _state;
@ -349,11 +349,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
nextThread ??= _idleThread; nextThread ??= _idleThread;
if (currentThread == nextThread) if (currentThread != nextThread)
{ {
return;
}
long previousTicks = LastContextSwitchTime; long previousTicks = LastContextSwitchTime;
long currentTicks = PerformanceCounter.ElapsedTicks; long currentTicks = PerformanceCounter.ElapsedTicks;
long ticksDelta = currentTicks - previousTicks; long ticksDelta = currentTicks - previousTicks;
@ -375,6 +372,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{ {
_previousThread = null; _previousThread = null;
} }
}
if (nextThread.CurrentCore != _coreId) if (nextThread.CurrentCore != _coreId)
{ {
@ -469,6 +467,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{ {
KThread currentThread = KernelStatic.GetCurrentThread(); KThread currentThread = KernelStatic.GetCurrentThread();
if (!currentThread.IsSchedulable)
{
return;
}
context.CriticalSection.Enter(); context.CriticalSection.Enter();
if (currentThread.SchedFlags != ThreadSchedState.Running) if (currentThread.SchedFlags != ThreadSchedState.Running)
@ -491,6 +494,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{ {
KThread currentThread = KernelStatic.GetCurrentThread(); KThread currentThread = KernelStatic.GetCurrentThread();
if (!currentThread.IsSchedulable)
{
return;
}
context.CriticalSection.Enter(); context.CriticalSection.Enter();
if (currentThread.SchedFlags != ThreadSchedState.Running) if (currentThread.SchedFlags != ThreadSchedState.Running)
@ -550,6 +558,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{ {
KThread currentThread = KernelStatic.GetCurrentThread(); KThread currentThread = KernelStatic.GetCurrentThread();
if (!currentThread.IsSchedulable)
{
return;
}
context.CriticalSection.Enter(); context.CriticalSection.Enter();
if (currentThread.SchedFlags != ThreadSchedState.Running) if (currentThread.SchedFlags != ThreadSchedState.Running)