From 6c9565693fd87ae1af81ed63b5fbdde2a5dbecb8 Mon Sep 17 00:00:00 2001 From: gdkchan 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/SupervisorCall/Syscall.cs | 54 +----------------------- 1 file changed, 1 insertion(+), 53 deletions(-) (limited to 'Ryujinx.HLE/HOS/Kernel/SupervisorCall') diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs index 715cb96a..c1e7026b 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs @@ -2,14 +2,12 @@ using Ryujinx.Common.Logging; using Ryujinx.Cpu; using Ryujinx.HLE.Exceptions; -using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Ipc; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Threading; using System; -using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { @@ -26,29 +24,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall // IPC - private struct HleIpcMessage - { - public KProcess Process { get; } - public KThread Thread { get; } - public KClientSession Session { get; } - public IpcMessage Message { get; } - public long MessagePtr { get; } - - public HleIpcMessage( - KProcess process, - KThread thread, - KClientSession session, - IpcMessage message, - long messagePtr) - { - Process = process; - Thread = thread; - Session = session; - Message = message; - MessagePtr = messagePtr; - } - } - public KernelResult ConnectToNamedPort(ulong namePtr, out int handle) { handle = 0; @@ -135,16 +110,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall currentThread.Reschedule(ThreadSchedState.Paused); - IpcMessage message = new IpcMessage(messageData, (long)messagePtr); - - ThreadPool.QueueUserWorkItem(ProcessIpcRequest, new HleIpcMessage( - process, - currentThread, - clientSession, - message, - (long)messagePtr)); - - _context.ThreadCounter.AddCount(); + clientSession.Service.Server.PushMessage(_device, currentThread, clientSession, messagePtr, messageSize); _context.CriticalSection.Leave(); @@ -158,24 +124,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } } - private void ProcessIpcRequest(object state) - { - HleIpcMessage ipcMessage = (HleIpcMessage)state; - - ipcMessage.Thread.ObjSyncResult = IpcHandler.IpcCall( - _device, - ipcMessage.Process, - ipcMessage.Process.CpuMemory, - ipcMessage.Thread, - ipcMessage.Session, - ipcMessage.Message, - ipcMessage.MessagePtr); - - _context.ThreadCounter.Signal(); - - ipcMessage.Thread.Reschedule(ThreadSchedState.Running); - } - private KernelResult SendSyncRequest(int handle) { KProcess currentProcess = _context.Scheduler.GetCurrentProcess(); -- cgit v1.2.3