| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- using Ryujinx.HLE.HOS.Kernel.Common;
- using Ryujinx.HLE.HOS.Kernel.Process;
- using Ryujinx.HLE.HOS.Kernel.Threading;
- using Ryujinx.HLE.HOS.Services;
- 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; }
- // TODO: Remove that, we need it for now to allow HLE
- // services implementation to work with the new IPC system.
- public IpcService Service { get; set; }
- public KClientSession(KernelContext context, KSession parent, KClientPort parentPort) : base(context)
- {
- _parent = parent;
- ParentPort = parentPort;
- parentPort?.IncrementReferenceCount();
- State = ChannelState.Open;
- CreatorProcess = context.Scheduler.GetCurrentProcess();
- CreatorProcess.IncrementReferenceCount();
- }
- public KernelResult SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
- {
- KThread currentThread = KernelContext.Scheduler.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 = KernelContext.Scheduler.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();
- }
- }
- }
|