diff options
author | gdkchan <gab.dark.100@gmail.com> | 2020-05-04 00:41:29 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-04 13:41:29 +1000 |
commit | 15d1cc806b1b978bab83d8bb426a124d9f0f788c (patch) | |
tree | 4fd10fdd11412bafcf3022e7cc4eb21179eef1b1 /Ryujinx.HLE/HOS/Kernel/Threading | |
parent | cd48576f5846aa89a36bfc833e9de5dde9627aed (diff) |
Move kernel state out of the Horizon class (#1107)
* Move kernel state from Horizon to KernelContext
* Merge syscalls partial classes, split 32 and 64-bit variants
* Sort usings
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Threading')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs | 170 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs | 20 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs | 19 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs | 6 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs | 12 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs | 14 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs | 28 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs | 136 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs | 4 |
9 files changed, 204 insertions, 205 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs index 71ad712e..2922ee1a 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs @@ -10,40 +10,40 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { private const int HasListenersMask = 0x40000000; - private Horizon _system; + private readonly KernelContext _context; - public List<KThread> CondVarThreads; - public List<KThread> ArbiterThreads; + private readonly List<KThread> _condVarThreads; + private readonly List<KThread> _arbiterThreads; - public KAddressArbiter(Horizon system) + public KAddressArbiter(KernelContext context) { - _system = system; + _context = context; - CondVarThreads = new List<KThread>(); - ArbiterThreads = new List<KThread>(); + _condVarThreads = new List<KThread>(); + _arbiterThreads = new List<KThread>(); } public KernelResult ArbitrateLock(int ownerHandle, ulong mutexAddress, int requesterHandle) { - KThread currentThread = _system.Scheduler.GetCurrentThread(); + KThread currentThread = _context.Scheduler.GetCurrentThread(); - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); currentThread.SignaledObj = null; currentThread.ObjSyncResult = KernelResult.Success; - KProcess currentProcess = _system.Scheduler.GetCurrentProcess(); + KProcess currentProcess = _context.Scheduler.GetCurrentProcess(); - if (!KernelTransfer.UserToKernelInt32(_system, mutexAddress, out int mutexValue)) + if (!KernelTransfer.UserToKernelInt32(_context, mutexAddress, out int mutexValue)) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidMemState; } if (mutexValue != (ownerHandle | HasListenersMask)) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return 0; } @@ -52,7 +52,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (mutexOwner == null) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidHandle; } @@ -64,24 +64,24 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading currentThread.Reschedule(ThreadSchedState.Paused); - _system.CriticalSection.Leave(); - _system.CriticalSection.Enter(); + _context.CriticalSection.Leave(); + _context.CriticalSection.Enter(); if (currentThread.MutexOwner != null) { currentThread.MutexOwner.RemoveMutexWaiter(currentThread); } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); - return (KernelResult)currentThread.ObjSyncResult; + return currentThread.ObjSyncResult; } public KernelResult ArbitrateUnlock(ulong mutexAddress) { - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); - KThread currentThread = _system.Scheduler.GetCurrentThread(); + KThread currentThread = _context.Scheduler.GetCurrentThread(); (KernelResult result, KThread newOwnerThread) = MutexUnlock(currentThread, mutexAddress); @@ -91,7 +91,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading newOwnerThread.ObjSyncResult = result; } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return result; } @@ -102,9 +102,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading int threadHandle, long timeout) { - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); - KThread currentThread = _system.Scheduler.GetCurrentThread(); + KThread currentThread = _context.Scheduler.GetCurrentThread(); currentThread.SignaledObj = null; currentThread.ObjSyncResult = KernelResult.TimedOut; @@ -112,7 +112,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (currentThread.ShallBeTerminated || currentThread.SchedFlags == ThreadSchedState.TerminationPending) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.ThreadTerminating; } @@ -121,7 +121,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (result != KernelResult.Success) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return result; } @@ -130,7 +130,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading currentThread.ThreadHandleForUserMutex = threadHandle; currentThread.CondVarAddress = condVarAddress; - CondVarThreads.Add(currentThread); + _condVarThreads.Add(currentThread); if (timeout != 0) { @@ -138,29 +138,29 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (timeout > 0) { - _system.TimeManager.ScheduleFutureInvocation(currentThread, timeout); + _context.TimeManager.ScheduleFutureInvocation(currentThread, timeout); } } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); if (timeout > 0) { - _system.TimeManager.UnscheduleFutureInvocation(currentThread); + _context.TimeManager.UnscheduleFutureInvocation(currentThread); } - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); if (currentThread.MutexOwner != null) { currentThread.MutexOwner.RemoveMutexWaiter(currentThread); } - CondVarThreads.Remove(currentThread); + _condVarThreads.Remove(currentThread); - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); - return (KernelResult)currentThread.ObjSyncResult; + return currentThread.ObjSyncResult; } private (KernelResult, KThread) MutexUnlock(KThread currentThread, ulong mutexAddress) @@ -186,7 +186,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelResult result = KernelResult.Success; - if (!KernelTransfer.KernelToUserInt32(_system, mutexAddress, mutexValue)) + if (!KernelTransfer.KernelToUserInt32(_context, mutexAddress, mutexValue)) { result = KernelResult.InvalidMemState; } @@ -198,9 +198,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { Queue<KThread> signaledThreads = new Queue<KThread>(); - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); - IOrderedEnumerable<KThread> sortedThreads = CondVarThreads.OrderBy(x => x.DynamicPriority); + IOrderedEnumerable<KThread> sortedThreads = _condVarThreads.OrderBy(x => x.DynamicPriority); foreach (KThread thread in sortedThreads.Where(x => x.CondVarAddress == address)) { @@ -217,17 +217,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading while (signaledThreads.TryDequeue(out KThread thread)) { - CondVarThreads.Remove(thread); + _condVarThreads.Remove(thread); } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); } private KThread TryAcquireMutex(KThread requester) { ulong address = requester.MutexAddress; - KProcess currentProcess = _system.Scheduler.GetCurrentProcess(); + KProcess currentProcess = _context.Scheduler.GetCurrentProcess(); if (!currentProcess.CpuMemory.IsMapped(address)) { @@ -293,14 +293,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public KernelResult WaitForAddressIfEqual(ulong address, int value, long timeout) { - KThread currentThread = _system.Scheduler.GetCurrentThread(); + KThread currentThread = _context.Scheduler.GetCurrentThread(); - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); if (currentThread.ShallBeTerminated || currentThread.SchedFlags == ThreadSchedState.TerminationPending) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.ThreadTerminating; } @@ -308,9 +308,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading currentThread.SignaledObj = null; currentThread.ObjSyncResult = KernelResult.TimedOut; - if (!KernelTransfer.UserToKernelInt32(_system, address, out int currentValue)) + if (!KernelTransfer.UserToKernelInt32(_context, address, out int currentValue)) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidMemState; } @@ -319,7 +319,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { if (timeout == 0) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.TimedOut; } @@ -327,37 +327,37 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading currentThread.MutexAddress = address; currentThread.WaitingInArbitration = true; - InsertSortedByPriority(ArbiterThreads, currentThread); + InsertSortedByPriority(_arbiterThreads, currentThread); currentThread.Reschedule(ThreadSchedState.Paused); if (timeout > 0) { - _system.TimeManager.ScheduleFutureInvocation(currentThread, timeout); + _context.TimeManager.ScheduleFutureInvocation(currentThread, timeout); } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); if (timeout > 0) { - _system.TimeManager.UnscheduleFutureInvocation(currentThread); + _context.TimeManager.UnscheduleFutureInvocation(currentThread); } - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); if (currentThread.WaitingInArbitration) { - ArbiterThreads.Remove(currentThread); + _arbiterThreads.Remove(currentThread); currentThread.WaitingInArbitration = false; } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); - return (KernelResult)currentThread.ObjSyncResult; + return currentThread.ObjSyncResult; } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidState; } @@ -368,14 +368,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading bool shouldDecrement, long timeout) { - KThread currentThread = _system.Scheduler.GetCurrentThread(); + KThread currentThread = _context.Scheduler.GetCurrentThread(); - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); if (currentThread.ShallBeTerminated || currentThread.SchedFlags == ThreadSchedState.TerminationPending) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.ThreadTerminating; } @@ -383,11 +383,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading currentThread.SignaledObj = null; currentThread.ObjSyncResult = KernelResult.TimedOut; - KProcess currentProcess = _system.Scheduler.GetCurrentProcess(); + KProcess currentProcess = _context.Scheduler.GetCurrentProcess(); - if (!KernelTransfer.UserToKernelInt32(_system, address, out int currentValue)) + if (!KernelTransfer.UserToKernelInt32(_context, address, out int currentValue)) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidMemState; } @@ -401,7 +401,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { if (timeout == 0) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.TimedOut; } @@ -409,37 +409,37 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading currentThread.MutexAddress = address; currentThread.WaitingInArbitration = true; - InsertSortedByPriority(ArbiterThreads, currentThread); + InsertSortedByPriority(_arbiterThreads, currentThread); currentThread.Reschedule(ThreadSchedState.Paused); if (timeout > 0) { - _system.TimeManager.ScheduleFutureInvocation(currentThread, timeout); + _context.TimeManager.ScheduleFutureInvocation(currentThread, timeout); } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); if (timeout > 0) { - _system.TimeManager.UnscheduleFutureInvocation(currentThread); + _context.TimeManager.UnscheduleFutureInvocation(currentThread); } - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); if (currentThread.WaitingInArbitration) { - ArbiterThreads.Remove(currentThread); + _arbiterThreads.Remove(currentThread); currentThread.WaitingInArbitration = false; } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); - return (KernelResult)currentThread.ObjSyncResult; + return currentThread.ObjSyncResult; } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidState; } @@ -470,24 +470,24 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public KernelResult Signal(ulong address, int count) { - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); WakeArbiterThreads(address, count); - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.Success; } public KernelResult SignalAndIncrementIfEqual(ulong address, int value, int count) { - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); - KProcess currentProcess = _system.Scheduler.GetCurrentProcess(); + KProcess currentProcess = _context.Scheduler.GetCurrentProcess(); if (!currentProcess.CpuMemory.IsMapped(address)) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidMemState; } @@ -502,7 +502,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (currentValue != value) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidState; } @@ -511,14 +511,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading WakeArbiterThreads(address, count); - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.Success; } public KernelResult SignalAndModifyIfEqual(ulong address, int value, int count) { - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); int offset; @@ -527,7 +527,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading // or negative. It is incremented if there are no threads waiting. int waitingCount = 0; - foreach (KThread thread in ArbiterThreads.Where(x => x.MutexAddress == address)) + foreach (KThread thread in _arbiterThreads.Where(x => x.MutexAddress == address)) { if (++waitingCount > count) { @@ -544,11 +544,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading offset = 1; } - KProcess currentProcess = _system.Scheduler.GetCurrentProcess(); + KProcess currentProcess = _context.Scheduler.GetCurrentProcess(); if (!currentProcess.CpuMemory.IsMapped(address)) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidMemState; } @@ -563,7 +563,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (currentValue != value) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.InvalidState; } @@ -572,7 +572,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading WakeArbiterThreads(address, count); - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.Success; } @@ -581,7 +581,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { Queue<KThread> signaledThreads = new Queue<KThread>(); - foreach (KThread thread in ArbiterThreads.Where(x => x.MutexAddress == address)) + foreach (KThread thread in _arbiterThreads.Where(x => x.MutexAddress == address)) { signaledThreads.Enqueue(thread); @@ -601,7 +601,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading thread.WaitingInArbitration = false; - ArbiterThreads.Remove(thread); + _arbiterThreads.Remove(thread); } } } diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs index 41473643..dd7e67ae 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KConditionVariable.cs @@ -5,11 +5,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { static class KConditionVariable { - public static void Wait(Horizon system, LinkedList<KThread> threadList, object mutex, long timeout) + public static void Wait(KernelContext context, LinkedList<KThread> threadList, object mutex, long timeout) { - KThread currentThread = system.Scheduler.GetCurrentThread(); + KThread currentThread = context.Scheduler.GetCurrentThread(); - system.CriticalSection.Enter(); + context.CriticalSection.Enter(); Monitor.Exit(mutex); @@ -28,29 +28,29 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading currentThread.Withholder = null; - system.CriticalSection.Leave(); + context.CriticalSection.Leave(); } else { if (timeout > 0) { - system.TimeManager.ScheduleFutureInvocation(currentThread, timeout); + context.TimeManager.ScheduleFutureInvocation(currentThread, timeout); } - system.CriticalSection.Leave(); + context.CriticalSection.Leave(); if (timeout > 0) { - system.TimeManager.UnscheduleFutureInvocation(currentThread); + context.TimeManager.UnscheduleFutureInvocation(currentThread); } } Monitor.Enter(mutex); } - public static void NotifyAll(Horizon system, LinkedList<KThread> threadList) + public static void NotifyAll(KernelContext context, LinkedList<KThread> threadList) { - system.CriticalSection.Enter(); + context.CriticalSection.Enter(); LinkedListNode<KThread> node = threadList.First; @@ -65,7 +65,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading thread.Reschedule(ThreadSchedState.Running); } - system.CriticalSection.Leave(); + context.CriticalSection.Leave(); } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs index b7013bb7..b778c2a4 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs @@ -1,19 +1,18 @@ -using ARMeilleure; using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.Threading { class KCriticalSection { - private Horizon _system; + private readonly KernelContext _context; public object LockObj { get; private set; } private int _recursionCount; - public KCriticalSection(Horizon system) + public KCriticalSection(KernelContext context) { - _system = system; + _context = context; LockObj = new object(); } @@ -36,20 +35,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (--_recursionCount == 0) { - if (_system.Scheduler.ThreadReselectionRequested) + if (_context.Scheduler.ThreadReselectionRequested) { - _system.Scheduler.SelectThreads(); + _context.Scheduler.SelectThreads(); } Monitor.Exit(LockObj); - if (_system.Scheduler.MultiCoreScheduling) + if (_context.Scheduler.MultiCoreScheduling) { - lock (_system.Scheduler.CoreContexts) + lock (_context.Scheduler.CoreContexts) { for (int core = 0; core < KScheduler.CpuCoresCount; core++) { - KCoreContext coreContext = _system.Scheduler.CoreContexts[core]; + KCoreContext coreContext = _context.Scheduler.CoreContexts[core]; if (coreContext.ContextSwitchNeeded) { @@ -86,7 +85,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (doContextSwitch) { - _system.Scheduler.ContextSwitch(); + _context.Scheduler.ContextSwitch(); } } } diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs index dd982291..da3e217b 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KEvent.cs @@ -5,10 +5,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public KReadableEvent ReadableEvent { get; private set; } public KWritableEvent WritableEvent { get; private set; } - public KEvent(Horizon system) + public KEvent(KernelContext context) { - ReadableEvent = new KReadableEvent(system, this); - WritableEvent = new KWritableEvent(system, this); + ReadableEvent = new KReadableEvent(context, this); + WritableEvent = new KWritableEvent(context, this); } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs index 9821de35..d378b81e 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs @@ -4,18 +4,18 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { class KReadableEvent : KSynchronizationObject { - private KEvent _parent; + private readonly KEvent _parent; private bool _signaled; - public KReadableEvent(Horizon system, KEvent parent) : base(system) + public KReadableEvent(KernelContext context, KEvent parent) : base(context) { _parent = parent; } public override void Signal() { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (!_signaled) { @@ -24,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading base.Signal(); } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } public KernelResult Clear() @@ -38,7 +38,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { KernelResult result; - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (_signaled) { @@ -51,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading result = KernelResult.InvalidState; } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return result; } diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs index dd5422b8..e07477ae 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs @@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading private const int PreemptionPriorityCores012 = 59; private const int PreemptionPriorityCore3 = 63; - private Horizon _system; + private readonly KernelContext _context; public KSchedulingData SchedulingData { get; private set; } @@ -21,9 +21,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public bool ThreadReselectionRequested { get; set; } - public KScheduler(Horizon system) + public KScheduler(KernelContext context) { - _system = system; + _context = context; SchedulingData = new KSchedulingData(); @@ -39,14 +39,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading private void PreemptThreads() { - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); PreemptThread(PreemptionPriorityCores012, 0); PreemptThread(PreemptionPriorityCores012, 1); PreemptThread(PreemptionPriorityCores012, 2); PreemptThread(PreemptionPriorityCore3, 3); - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); } private void PreemptThread(int prio, int core) @@ -224,9 +224,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading return _dummyThread; } - KProcess dummyProcess = new KProcess(_system); + KProcess dummyProcess = new KProcess(_context); - KThread dummyThread = new KThread(_system); + KThread dummyThread = new KThread(_context); dummyThread.Initialize(0, 0, 0, 44, 0, dummyProcess, ThreadType.Dummy); diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs index 865551a2..fa9b669e 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs @@ -5,11 +5,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { class KSynchronization { - private Horizon _system; + private KernelContext _context; - public KSynchronization(Horizon system) + public KSynchronization(KernelContext context) { - _system = system; + _context = context; } public KernelResult WaitFor(KSynchronizationObject[] syncObjs, long timeout, out int handleIndex) @@ -18,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelResult result = KernelResult.TimedOut; - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); // Check if objects are already signaled before waiting. for (int index = 0; index < syncObjs.Length; index++) @@ -30,19 +30,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading handleIndex = index; - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return KernelResult.Success; } if (timeout == 0) { - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return result; } - KThread currentThread = _system.Scheduler.GetCurrentThread(); + KThread currentThread = _context.Scheduler.GetCurrentThread(); if (currentThread.ShallBeTerminated || currentThread.SchedFlags == ThreadSchedState.TerminationPending) @@ -72,19 +72,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (timeout > 0) { - _system.TimeManager.ScheduleFutureInvocation(currentThread, timeout); + _context.TimeManager.ScheduleFutureInvocation(currentThread, timeout); } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); currentThread.WaitingSync = false; if (timeout > 0) { - _system.TimeManager.UnscheduleFutureInvocation(currentThread); + _context.TimeManager.UnscheduleFutureInvocation(currentThread); } - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); result = currentThread.ObjSyncResult; @@ -101,14 +101,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); return result; } public void SignalObject(KSynchronizationObject syncObj) { - _system.CriticalSection.Enter(); + _context.CriticalSection.Enter(); if (syncObj.IsSignaled()) { @@ -130,7 +130,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - _system.CriticalSection.Leave(); + _context.CriticalSection.Leave(); } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index 24c4b2a3..754a1e53 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -91,10 +91,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public long LastPc { get; set; } - public KThread(Horizon system) : base(system) + public KThread(KernelContext context) : base(context) { - _scheduler = system.Scheduler; - _schedulingData = system.Scheduler.SchedulingData; + _scheduler = KernelContext.Scheduler; + _schedulingData = KernelContext.Scheduler.SchedulingData; SiblingsPerCore = new LinkedListNode<KThread>[KScheduler.CpuCoresCount]; @@ -185,7 +185,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading owner.SubscribeThreadEventHandlers(Context); - ThreadUid = System.GetThreadUid(); + ThreadUid = KernelContext.NewThreadUid(); HostThread.Name = $"HLE.HostThread.{ThreadUid}"; @@ -197,11 +197,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (owner.IsPaused) { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (ShallBeTerminated || SchedFlags == ThreadSchedState.TerminationPending) { - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return KernelResult.Success; } @@ -210,7 +210,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading CombineForcePauseFlags(); - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } } @@ -219,9 +219,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public KernelResult Start() { - if (!System.KernelInitialized) + if (!KernelContext.KernelInitialized) { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (!ShallBeTerminated && SchedFlags != ThreadSchedState.TerminationPending) { @@ -230,16 +230,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading CombineForcePauseFlags(); } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } KernelResult result = KernelResult.ThreadTerminating; - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (!ShallBeTerminated) { - KThread currentThread = System.Scheduler.GetCurrentThread(); + KThread currentThread = KernelContext.Scheduler.GetCurrentThread(); while (SchedFlags != ThreadSchedState.TerminationPending && currentThread.SchedFlags != ThreadSchedState.TerminationPending && @@ -269,8 +269,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { currentThread.CombineForcePauseFlags(); - System.CriticalSection.Leave(); - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Leave(); + KernelContext.CriticalSection.Enter(); if (currentThread.ShallBeTerminated) { @@ -280,7 +280,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return result; } @@ -296,20 +296,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _hasBeenReleased = true; } - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); _forcePauseFlags &= ~ThreadSchedState.ForcePauseMask; ExitImpl(); - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); DecrementReferenceCount(); } public ThreadSchedState PrepareForTermination() { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); ThreadSchedState result; @@ -351,7 +351,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading result = SchedFlags; - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return result & ThreadSchedState.LowMask; } @@ -362,7 +362,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (state != ThreadSchedState.TerminationPending) { - System.Synchronization.WaitFor(new KSynchronizationObject[] { this }, -1, out _); + KernelContext.Synchronization.WaitFor(new KSynchronizationObject[] { this }, -1, out _); } } @@ -374,14 +374,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { if (ShallBeTerminated || SchedFlags == ThreadSchedState.TerminationPending) { - System.Scheduler.ExitThread(this); + KernelContext.Scheduler.ExitThread(this); Exit(); // As the death of the thread is handled by the CPU emulator, we differ from the official kernel and return here. break; } - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (ShallBeTerminated || SchedFlags == ThreadSchedState.TerminationPending) { @@ -397,13 +397,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading state = ThreadSchedState.Running; } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } while (state == ThreadSchedState.TerminationPending); } private void ExitImpl() { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); SetNewSchedFlags(ThreadSchedState.TerminationPending); @@ -411,16 +411,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading Signal(); - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } public KernelResult Sleep(long timeout) { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (ShallBeTerminated || SchedFlags == ThreadSchedState.TerminationPending) { - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return KernelResult.ThreadTerminating; } @@ -429,14 +429,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (timeout > 0) { - System.TimeManager.ScheduleFutureInvocation(this, timeout); + KernelContext.TimeManager.ScheduleFutureInvocation(this, timeout); } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); if (timeout > 0) { - System.TimeManager.UnscheduleFutureInvocation(this); + KernelContext.TimeManager.UnscheduleFutureInvocation(this); } return 0; @@ -444,13 +444,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public void Yield() { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (SchedFlags != ThreadSchedState.Running) { - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); - System.Scheduler.ContextSwitch(); + KernelContext.Scheduler.ContextSwitch(); return; } @@ -463,20 +463,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _scheduler.ThreadReselectionRequested = true; - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); - System.Scheduler.ContextSwitch(); + KernelContext.Scheduler.ContextSwitch(); } public void YieldWithLoadBalancing() { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (SchedFlags != ThreadSchedState.Running) { - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); - System.Scheduler.ContextSwitch(); + KernelContext.Scheduler.ContextSwitch(); return; } @@ -536,20 +536,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _scheduler.ThreadReselectionRequested = true; } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); - System.Scheduler.ContextSwitch(); + KernelContext.Scheduler.ContextSwitch(); } public void YieldAndWaitForLoadBalancing() { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (SchedFlags != ThreadSchedState.Running) { - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); - System.Scheduler.ContextSwitch(); + KernelContext.Scheduler.ContextSwitch(); return; } @@ -592,38 +592,38 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _scheduler.ThreadReselectionRequested = true; } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); - System.Scheduler.ContextSwitch(); + KernelContext.Scheduler.ContextSwitch(); } public void SetPriority(int priority) { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); BasePriority = priority; UpdatePriorityInheritance(); - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } public KernelResult SetActivity(bool pause) { KernelResult result = KernelResult.Success; - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); ThreadSchedState lowNibble = SchedFlags & ThreadSchedState.LowMask; if (lowNibble != ThreadSchedState.Paused && lowNibble != ThreadSchedState.Running) { - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return KernelResult.InvalidState; } - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if (!ShallBeTerminated && SchedFlags != ThreadSchedState.TerminationPending) { @@ -666,15 +666,15 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - System.CriticalSection.Leave(); - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return result; } public void CancelSynchronization() { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if ((SchedFlags & ThreadSchedState.LowMask) != ThreadSchedState.Paused || !WaitingSync) { @@ -700,12 +700,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading SyncCancelled = false; } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } public KernelResult SetCoreAndAffinityMask(int newCore, long newAffinityMask) { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); bool useOverride = _affinityOverrideCount != 0; @@ -716,7 +716,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if ((newAffinityMask & (1 << newCore)) == 0) { - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return KernelResult.InvalidCombination; } @@ -754,7 +754,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); return KernelResult.Success; } @@ -784,7 +784,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading private void SetNewSchedFlags(ThreadSchedState newFlags) { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); ThreadSchedState oldFlags = SchedFlags; @@ -795,12 +795,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading AdjustScheduling(oldFlags); } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } public void ReleaseAndResume() { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); if ((SchedFlags & ThreadSchedState.LowMask) == ThreadSchedState.Paused) { @@ -818,12 +818,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } public void Reschedule(ThreadSchedState newFlags) { - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); ThreadSchedState oldFlags = SchedFlags; @@ -832,7 +832,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading AdjustScheduling(oldFlags); - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); } public void AddMutexWaiter(KThread requester) @@ -1150,8 +1150,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading private void ThreadExit() { - System.Scheduler.ExitThread(this); - System.Scheduler.RemoveThread(this); + KernelContext.Scheduler.ExitThread(this); + KernelContext.Scheduler.RemoveThread(this); } public bool IsCurrentHostThread() @@ -1180,7 +1180,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } else { - System.ResourceLimit.Release(LimitableResource.Thread, 1, released ? 0 : 1); + KernelContext.ResourceLimit.Release(LimitableResource.Thread, 1, released ? 0 : 1); } } } @@ -1194,7 +1194,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading throw new InvalidOperationException("Unexpected failure freeing thread local storage."); } - System.CriticalSection.Enter(); + KernelContext.CriticalSection.Enter(); // Wake up all threads that may be waiting for a mutex being held by this thread. foreach (KThread thread in _mutexWaiters) @@ -1206,7 +1206,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading thread.ReleaseAndResume(); } - System.CriticalSection.Leave(); + KernelContext.CriticalSection.Leave(); Owner?.DecrementThreadCountAndTerminateIfZero(); } diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs index 1db88995..7aee0b57 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs @@ -4,9 +4,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { class KWritableEvent : KAutoObject { - private KEvent _parent; + private readonly KEvent _parent; - public KWritableEvent(Horizon system, KEvent parent) : base(system) + public KWritableEvent(KernelContext context, KEvent parent) : base(context) { _parent = parent; } |