Fix a specific core migration bug on the scheduler (#2271)
This commit is contained in:
parent
701c427659
commit
ebdbaa6db0
1 changed files with 35 additions and 22 deletions
|
@ -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)
|
||||
|
|
Reference in a new issue