From 6c9565693fd87ae1af81ed63b5fbdde2a5dbecb8 Mon Sep 17 00:00:00 2001 From: gdkchan <gab.dark.100@gmail.com> Date: Tue, 22 Sep 2020 01:50:40 -0300 Subject: IPC refactor part 1: Use explicit separate threads to process requests (#1447) * Changes to allow explicit management of service threads * Remove now unused code * Remove ThreadCounter, its no longer needed * Allow and use separate server per service, also fix exit issues * New policy change: PTC version now uses PR number --- Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs | 34 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs') diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index d9b2c039..d02e25a3 100644 --- a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -791,19 +791,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Process private void InterruptHandler(object sender, EventArgs e) { KernelContext.Scheduler.ContextSwitch(); + KernelContext.Scheduler.GetCurrentThread().HandlePostSyscall(); } public void IncrementThreadCount() { Interlocked.Increment(ref _threadCount); - - KernelContext.ThreadCounter.AddCount(); } public void DecrementThreadCountAndTerminateIfZero() { - KernelContext.ThreadCounter.Signal(); - if (Interlocked.Decrement(ref _threadCount) == 0) { Terminate(); @@ -812,8 +809,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process public void DecrementToZeroWhileTerminatingCurrent() { - KernelContext.ThreadCounter.Signal(); - while (Interlocked.Decrement(ref _threadCount) != 0) { Destroy(); @@ -1000,24 +995,29 @@ namespace Ryujinx.HLE.HOS.Kernel.Process KernelContext.CriticalSection.Leave(); } - KThread blockedThread = null; - - lock (_threadingLock) + while (true) { - foreach (KThread thread in _threads) + KThread blockedThread = null; + + lock (_threadingLock) { - if (thread != currentThread && (thread.SchedFlags & ThreadSchedState.LowMask) != ThreadSchedState.TerminationPending) + foreach (KThread thread in _threads) { - thread.IncrementReferenceCount(); + if (thread != currentThread && (thread.SchedFlags & ThreadSchedState.LowMask) != ThreadSchedState.TerminationPending) + { + thread.IncrementReferenceCount(); - blockedThread = thread; - break; + blockedThread = thread; + break; + } } } - } - if (blockedThread != null) - { + if (blockedThread == null) + { + break; + } + blockedThread.Terminate(); blockedThread.DecrementReferenceCount(); } -- cgit v1.2.3-70-g09d2