aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Kernel/Threading
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel/Threading')
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/ArbitrationType.cs6
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs42
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs2
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs2
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs4
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs4
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs7
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs24
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs10
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs8
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs2
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/SignalType.cs4
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadSchedState.cs22
-rw-r--r--src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadType.cs4
14 files changed, 63 insertions, 78 deletions
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/ArbitrationType.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/ArbitrationType.cs
index 89c1bf1f..ddcf0202 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/ArbitrationType.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/ArbitrationType.cs
@@ -2,8 +2,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{
enum ArbitrationType
{
- WaitIfLessThan = 0,
+ WaitIfLessThan = 0,
DecrementAndWaitIfLessThan = 1,
- WaitIfEqual = 2
+ WaitIfEqual = 2,
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
index 57fbabd5..f6b9a112 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
@@ -38,7 +38,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return KernelResult.ThreadTerminating;
}
- currentThread.SignaledObj = null;
+ currentThread.SignaledObj = null;
currentThread.ObjSyncResult = Result.Success;
KProcess currentProcess = KernelStatic.GetCurrentProcess();
@@ -66,7 +66,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return KernelResult.InvalidHandle;
}
- currentThread.MutexAddress = mutexAddress;
+ currentThread.MutexAddress = mutexAddress;
currentThread.ThreadHandleForUserMutex = requesterHandle;
mutexOwner.AddMutexWaiter(currentThread);
@@ -76,10 +76,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
_context.CriticalSection.Leave();
_context.CriticalSection.Enter();
- if (currentThread.MutexOwner != null)
- {
- currentThread.MutexOwner.RemoveMutexWaiter(currentThread);
- }
+ currentThread.MutexOwner?.RemoveMutexWaiter(currentThread);
_context.CriticalSection.Leave();
@@ -103,7 +100,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
if (result != Result.Success && newOwnerThread != null)
{
- newOwnerThread.SignaledObj = null;
+ newOwnerThread.SignaledObj = null;
newOwnerThread.ObjSyncResult = result;
}
@@ -118,7 +115,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
KThread currentThread = KernelStatic.GetCurrentThread();
- currentThread.SignaledObj = null;
+ currentThread.SignaledObj = null;
currentThread.ObjSyncResult = KernelResult.TimedOut;
if (currentThread.TerminationRequested)
@@ -139,9 +136,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return KernelResult.InvalidMemState;
}
- currentThread.MutexAddress = mutexAddress;
+ currentThread.MutexAddress = mutexAddress;
currentThread.ThreadHandleForUserMutex = threadHandle;
- currentThread.CondVarAddress = condVarAddress;
+ currentThread.CondVarAddress = condVarAddress;
_condVarThreads.Add(currentThread);
@@ -164,10 +161,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
_context.CriticalSection.Enter();
- if (currentThread.MutexOwner != null)
- {
- currentThread.MutexOwner.RemoveMutexWaiter(currentThread);
- }
+ currentThread.MutexOwner?.RemoveMutexWaiter(currentThread);
_condVarThreads.Remove(currentThread);
@@ -176,7 +170,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return currentThread.ObjSyncResult;
}
- private (int, KThread) MutexUnlock(KThread currentThread, ulong mutexAddress)
+ private static (int, KThread) MutexUnlock(KThread currentThread, ulong mutexAddress)
{
KThread newOwnerThread = currentThread.RelinquishMutex(mutexAddress, out int count);
@@ -191,7 +185,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
mutexValue |= HasListenersMask;
}
- newOwnerThread.SignaledObj = null;
+ newOwnerThread.SignaledObj = null;
newOwnerThread.ObjSyncResult = Result.Success;
newOwnerThread.ReleaseAndResume();
@@ -223,7 +217,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
if (!currentProcess.CpuMemory.IsMapped(address))
{
// Invalid address.
- requester.SignaledObj = null;
+ requester.SignaledObj = null;
requester.ObjSyncResult = KernelResult.InvalidMemState;
return;
@@ -253,7 +247,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
if (mutexValue == 0)
{
// We now own the mutex.
- requester.SignaledObj = null;
+ requester.SignaledObj = null;
requester.ObjSyncResult = Result.Success;
requester.ReleaseAndResume();
@@ -273,7 +267,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
else
{
// Invalid mutex owner.
- requester.SignaledObj = null;
+ requester.SignaledObj = null;
requester.ObjSyncResult = KernelResult.InvalidHandle;
requester.ReleaseAndResume();
@@ -293,7 +287,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return KernelResult.ThreadTerminating;
}
- currentThread.SignaledObj = null;
+ currentThread.SignaledObj = null;
currentThread.ObjSyncResult = KernelResult.TimedOut;
if (!KernelTransfer.UserToKernel(out int currentValue, address))
@@ -312,7 +306,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return KernelResult.TimedOut;
}
- currentThread.MutexAddress = address;
+ currentThread.MutexAddress = address;
currentThread.WaitingInArbitration = true;
_arbiterThreads.Add(currentThread);
@@ -363,7 +357,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return KernelResult.ThreadTerminating;
}
- currentThread.SignaledObj = null;
+ currentThread.SignaledObj = null;
currentThread.ObjSyncResult = KernelResult.TimedOut;
KProcess currentProcess = KernelStatic.GetCurrentProcess();
@@ -389,7 +383,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return KernelResult.TimedOut;
}
- currentThread.MutexAddress = address;
+ currentThread.MutexAddress = address;
currentThread.WaitingInArbitration = true;
_arbiterThreads.Add(currentThread);
@@ -551,7 +545,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{
static void RemoveArbiterThread(KThread thread)
{
- thread.SignaledObj = null;
+ thread.SignaledObj = null;
thread.ObjSyncResult = Result.Success;
thread.ReleaseAndResume();
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs
index 891e632f..c6aa984c 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs
@@ -67,4 +67,4 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
context.CriticalSection.Leave();
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs
index 1d61f2f0..3d674488 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs
@@ -61,4 +61,4 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs
index da3e217b..65169d03 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs
@@ -7,8 +7,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
public KEvent(KernelContext context)
{
- ReadableEvent = new KReadableEvent(context, this);
+ ReadableEvent = new KReadableEvent(context);
WritableEvent = new KWritableEvent(context, this);
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs
index 14fba704..1608db09 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs
@@ -68,7 +68,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
_prioMask &= ~(1L << _prio);
}
- public KThread Current => _node?.Value;
+ public readonly KThread Current => _node?.Value;
public bool MoveNext()
{
@@ -283,4 +283,4 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return _scheduledThreadsPerPrioPerCore[prio][core];
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs
index d9e7befa..6ed61f5a 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs
@@ -5,13 +5,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{
class KReadableEvent : KSynchronizationObject
{
- private readonly KEvent _parent;
-
private bool _signaled;
- public KReadableEvent(KernelContext context, KEvent parent) : base(context)
+ public KReadableEvent(KernelContext context) : base(context)
{
- _parent = parent;
}
public override void Signal()
@@ -62,4 +59,4 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return _signaled;
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
index b9de7d9c..905c61d6 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs
@@ -9,11 +9,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
partial class KScheduler : IDisposable
{
public const int PrioritiesCount = 64;
- public const int CpuCoresCount = 4;
+ public const int CpuCoresCount = 4;
private const int RoundRobinTimeQuantumMs = 10;
- private static readonly int[] PreemptionPriorities = new int[] { 59, 59, 59, 63 };
+ private static readonly int[] _preemptionPriorities = { 59, 59, 59, 63 };
private static readonly int[] _srcCoresHighestPrioThreads = new int[CpuCoresCount];
@@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
private KThread CreateIdleThread(KernelContext context, int cpuCore)
{
- KThread idleThread = new KThread(context);
+ KThread idleThread = new(context);
idleThread.Initialize(0UL, 0UL, 0UL, PrioritiesCount, cpuCore, null, ThreadType.Dummy, IdleThreadLoop);
@@ -95,7 +95,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{
KThread candidate = thread.Owner.PinnedThreads[core];
- if (candidate.KernelWaitersCount == 0 && !thread.Owner.IsExceptionUserThread(candidate))
+ if (candidate.KernelWaitersCount == 0 && !KProcess.IsExceptionUserThread(candidate))
{
if (candidate.SchedFlags == ThreadSchedState.Running)
{
@@ -378,10 +378,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
currentThread.AddCpuTime(ticksDelta);
- if (currentProcess != null)
- {
- currentProcess.AddCpuTime(ticksDelta);
- }
+ currentProcess?.AddCpuTime(ticksDelta);
LastContextSwitchTime = currentTicks;
@@ -411,7 +408,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
for (int core = 0; core < CpuCoresCount; core++)
{
- RotateScheduledQueue(context, core, PreemptionPriorities[core]);
+ RotateScheduledQueue(context, core, _preemptionPriorities[core]);
}
context.CriticalSection.Leave();
@@ -431,7 +428,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
nextThread = context.PriorityQueue.Reschedule(prio, core, selectedThread);
}
- static KThread FirstSuitableCandidateOrDefault(KernelContext context, int core, KThread selectedThread, KThread nextThread, Predicate< KThread> predicate)
+ static KThread FirstSuitableCandidateOrDefault(KernelContext context, int core, KThread selectedThread, KThread nextThread, Predicate<KThread> predicate)
{
foreach (KThread suggested in context.PriorityQueue.SuggestedThreads(core))
{
@@ -651,11 +648,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
// Ensure that the idle thread is not blocked and can exit.
lock (_idleInterruptEventLock)
{
- if (_idleInterruptEvent != null)
- {
- _idleInterruptEvent.Set();
- }
+ _idleInterruptEvent?.Set();
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs
index 9c196810..b1af06b0 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs
@@ -8,7 +8,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{
class KSynchronization
{
- private KernelContext _context;
+ private readonly KernelContext _context;
public KSynchronization(KernelContext context)
{
@@ -68,8 +68,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
syncNodes[index] = syncObjs[index].AddWaitingThread(currentThread);
}
- currentThread.WaitingSync = true;
- currentThread.SignaledObj = null;
+ currentThread.WaitingSync = true;
+ currentThread.SignaledObj = null;
currentThread.ObjSyncResult = result;
currentThread.Reschedule(ThreadSchedState.Paused);
@@ -126,7 +126,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
if ((thread.SchedFlags & ThreadSchedState.LowMask) == ThreadSchedState.Paused)
{
- thread.SignaledObj = syncObj;
+ thread.SignaledObj = syncObj;
thread.ObjSyncResult = Result.Success;
thread.Reschedule(ThreadSchedState.Running);
@@ -139,4 +139,4 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
_context.CriticalSection.Leave();
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs
index 78bd577e..12383fb8 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs
@@ -68,10 +68,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
public LinkedListNode<KThread> ProcessListNode { get; set; }
- private LinkedList<KThread> _mutexWaiters;
+ private readonly LinkedList<KThread> _mutexWaiters;
private LinkedListNode<KThread> _mutexWaiterNode;
- private LinkedList<KThread> _pinnedWaiters;
+ private readonly LinkedList<KThread> _pinnedWaiters;
public KThread MutexOwner { get; private set; }
@@ -659,7 +659,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
const int MaxRegistersAArch32 = 15;
const int MaxFpuRegistersAArch32 = 16;
- ThreadContext context = new ThreadContext();
+ ThreadContext context = new();
if (Owner.Flags.HasFlag(ProcessCreationFlags.Is64Bit))
{
@@ -1433,4 +1433,4 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
Owner.CpuMemory.Write<ushort>(_tlsAddress + TlsUserInterruptFlagOffset, 0);
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs
index b46122be..fd65361a 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs
@@ -22,4 +22,4 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
return _parent.ReadableEvent.Clear();
}
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/SignalType.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/SignalType.cs
index e72b719b..9f257d98 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/SignalType.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/SignalType.cs
@@ -2,8 +2,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
{
enum SignalType
{
- Signal = 0,
+ Signal = 0,
SignalAndIncrementIfEqual = 1,
- SignalAndModifyIfEqual = 2
+ SignalAndModifyIfEqual = 2,
}
}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadSchedState.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadSchedState.cs
index 1d09e021..eca412d0 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadSchedState.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadSchedState.cs
@@ -5,19 +5,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
[Flags]
enum ThreadSchedState : ushort
{
- LowMask = 0xf,
- HighMask = 0xfff0,
+ LowMask = 0xf,
+ HighMask = 0xfff0,
ForcePauseMask = 0x1f0,
- ProcessPauseFlag = 1 << 4,
- ThreadPauseFlag = 1 << 5,
+ ProcessPauseFlag = 1 << 4,
+ ThreadPauseFlag = 1 << 5,
ProcessDebugPauseFlag = 1 << 6,
- BacktracePauseFlag = 1 << 7,
- KernelInitPauseFlag = 1 << 8,
+ BacktracePauseFlag = 1 << 7,
+ KernelInitPauseFlag = 1 << 8,
- None = 0,
- Paused = 1,
- Running = 2,
- TerminationPending = 3
+ None = 0,
+ Paused = 1,
+ Running = 2,
+ TerminationPending = 3,
}
-} \ No newline at end of file
+}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadType.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadType.cs
index 0b44b57f..83093570 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadType.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/ThreadType.cs
@@ -5,6 +5,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
Dummy,
Kernel,
Kernel2,
- User
+ User,
}
-} \ No newline at end of file
+}