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