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