| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- using Ryujinx.HLE.HOS.Kernel.Common;
- using Ryujinx.HLE.HOS.Kernel.Process;
- using Ryujinx.HLE.HOS.Kernel.Threading;
- 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 KernelResult 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 = KernelResult.Success;
- KernelResult result = _parent.ServerSession.EnqueueRequest(request);
- KernelContext.CriticalSection.Leave();
- if (result == KernelResult.Success)
- {
- result = currentThread.ObjSyncResult;
- }
- return result;
- }
- public KernelResult SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
- {
- KThread currentThread = KernelStatic.GetCurrentThread();
- KSessionRequest request = new KSessionRequest(currentThread, customCmdBuffAddr, customCmdBuffSize, asyncEvent);
- KernelContext.CriticalSection.Enter();
- KernelResult 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();
- }
- }
- }
|