diff options
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel/Threading')
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 +} |