aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs142
1 files changed, 0 insertions, 142 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs
deleted file mode 100644
index 9c196810..00000000
--- a/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-using Ryujinx.HLE.HOS.Kernel.Common;
-using Ryujinx.Horizon.Common;
-using System;
-using System.Buffers;
-using System.Collections.Generic;
-
-namespace Ryujinx.HLE.HOS.Kernel.Threading
-{
- class KSynchronization
- {
- private KernelContext _context;
-
- public KSynchronization(KernelContext context)
- {
- _context = context;
- }
-
- public Result WaitFor(Span<KSynchronizationObject> syncObjs, long timeout, out int handleIndex)
- {
- handleIndex = 0;
-
- Result result = KernelResult.TimedOut;
-
- _context.CriticalSection.Enter();
-
- // Check if objects are already signaled before waiting.
- for (int index = 0; index < syncObjs.Length; index++)
- {
- if (!syncObjs[index].IsSignaled())
- {
- continue;
- }
-
- handleIndex = index;
-
- _context.CriticalSection.Leave();
-
- return Result.Success;
- }
-
- if (timeout == 0)
- {
- _context.CriticalSection.Leave();
-
- return result;
- }
-
- KThread currentThread = KernelStatic.GetCurrentThread();
-
- if (currentThread.TerminationRequested)
- {
- result = KernelResult.ThreadTerminating;
- }
- else if (currentThread.SyncCancelled)
- {
- currentThread.SyncCancelled = false;
-
- result = KernelResult.Cancelled;
- }
- else
- {
- LinkedListNode<KThread>[] syncNodesArray = ArrayPool<LinkedListNode<KThread>>.Shared.Rent(syncObjs.Length);
-
- Span<LinkedListNode<KThread>> syncNodes = syncNodesArray.AsSpan(0, syncObjs.Length);
-
- for (int index = 0; index < syncObjs.Length; index++)
- {
- syncNodes[index] = syncObjs[index].AddWaitingThread(currentThread);
- }
-
- currentThread.WaitingSync = true;
- currentThread.SignaledObj = null;
- currentThread.ObjSyncResult = result;
-
- currentThread.Reschedule(ThreadSchedState.Paused);
-
- if (timeout > 0)
- {
- _context.TimeManager.ScheduleFutureInvocation(currentThread, timeout);
- }
-
- _context.CriticalSection.Leave();
-
- currentThread.WaitingSync = false;
-
- if (timeout > 0)
- {
- _context.TimeManager.UnscheduleFutureInvocation(currentThread);
- }
-
- _context.CriticalSection.Enter();
-
- result = currentThread.ObjSyncResult;
-
- handleIndex = -1;
-
- for (int index = 0; index < syncObjs.Length; index++)
- {
- syncObjs[index].RemoveWaitingThread(syncNodes[index]);
-
- if (syncObjs[index] == currentThread.SignaledObj)
- {
- handleIndex = index;
- }
- }
-
- ArrayPool<LinkedListNode<KThread>>.Shared.Return(syncNodesArray);
- }
-
- _context.CriticalSection.Leave();
-
- return result;
- }
-
- public void SignalObject(KSynchronizationObject syncObj)
- {
- _context.CriticalSection.Enter();
-
- if (syncObj.IsSignaled())
- {
- LinkedListNode<KThread> node = syncObj.WaitingThreads.First;
-
- while (node != null)
- {
- KThread thread = node.Value;
-
- if ((thread.SchedFlags & ThreadSchedState.LowMask) == ThreadSchedState.Paused)
- {
- thread.SignaledObj = syncObj;
- thread.ObjSyncResult = Result.Success;
-
- thread.Reschedule(ThreadSchedState.Running);
- }
-
- node = node.Next;
- }
- }
-
- _context.CriticalSection.Leave();
- }
- }
-} \ No newline at end of file