diff options
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs')
-rw-r--r-- | src/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs b/src/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs new file mode 100644 index 00000000..a24bcc31 --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs @@ -0,0 +1,84 @@ +using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; + +namespace Ryujinx.HLE.HOS.Kernel.Ipc +{ + class KClientSession : KSynchronizationObject + { + public KProcess CreatorProcess { get; } + + private KSession _parent; + + public ChannelState State { get; set; } + + public KClientPort ParentPort { get; } + + public KClientSession(KernelContext context, KSession parent, KClientPort parentPort) : base(context) + { + _parent = parent; + ParentPort = parentPort; + + parentPort?.IncrementReferenceCount(); + + State = ChannelState.Open; + + CreatorProcess = KernelStatic.GetCurrentProcess(); + CreatorProcess.IncrementReferenceCount(); + } + + public Result SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + { + KThread currentThread = KernelStatic.GetCurrentThread(); + + KSessionRequest request = new KSessionRequest(currentThread, customCmdBuffAddr, customCmdBuffSize); + + KernelContext.CriticalSection.Enter(); + + currentThread.SignaledObj = null; + currentThread.ObjSyncResult = Result.Success; + + Result result = _parent.ServerSession.EnqueueRequest(request); + + KernelContext.CriticalSection.Leave(); + + if (result == Result.Success) + { + result = currentThread.ObjSyncResult; + } + + return result; + } + + public Result SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + { + KThread currentThread = KernelStatic.GetCurrentThread(); + + KSessionRequest request = new KSessionRequest(currentThread, customCmdBuffAddr, customCmdBuffSize, asyncEvent); + + KernelContext.CriticalSection.Enter(); + + Result result = _parent.ServerSession.EnqueueRequest(request); + + KernelContext.CriticalSection.Leave(); + + return result; + } + + public void DisconnectFromPort() + { + if (ParentPort != null) + { + ParentPort.Disconnect(); + ParentPort.DecrementReferenceCount(); + } + } + + protected override void Destroy() + { + _parent.DisconnectClient(); + _parent.DecrementReferenceCount(); + } + } +}
\ No newline at end of file |