KClientSession.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Ryujinx.HLE.HOS.Kernel.Common;
  2. using Ryujinx.HLE.HOS.Kernel.Process;
  3. using Ryujinx.HLE.HOS.Kernel.Threading;
  4. namespace Ryujinx.HLE.HOS.Kernel.Ipc
  5. {
  6. class KClientSession : KSynchronizationObject
  7. {
  8. public KProcess CreatorProcess { get; }
  9. private KSession _parent;
  10. public ChannelState State { get; set; }
  11. public KClientPort ParentPort { get; }
  12. public KClientSession(KernelContext context, KSession parent, KClientPort parentPort) : base(context)
  13. {
  14. _parent = parent;
  15. ParentPort = parentPort;
  16. parentPort?.IncrementReferenceCount();
  17. State = ChannelState.Open;
  18. CreatorProcess = KernelStatic.GetCurrentProcess();
  19. CreatorProcess.IncrementReferenceCount();
  20. }
  21. public KernelResult SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
  22. {
  23. KThread currentThread = KernelStatic.GetCurrentThread();
  24. KSessionRequest request = new KSessionRequest(currentThread, customCmdBuffAddr, customCmdBuffSize);
  25. KernelContext.CriticalSection.Enter();
  26. currentThread.SignaledObj = null;
  27. currentThread.ObjSyncResult = KernelResult.Success;
  28. KernelResult result = _parent.ServerSession.EnqueueRequest(request);
  29. KernelContext.CriticalSection.Leave();
  30. if (result == KernelResult.Success)
  31. {
  32. result = currentThread.ObjSyncResult;
  33. }
  34. return result;
  35. }
  36. public KernelResult SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
  37. {
  38. KThread currentThread = KernelStatic.GetCurrentThread();
  39. KSessionRequest request = new KSessionRequest(currentThread, customCmdBuffAddr, customCmdBuffSize, asyncEvent);
  40. KernelContext.CriticalSection.Enter();
  41. KernelResult result = _parent.ServerSession.EnqueueRequest(request);
  42. KernelContext.CriticalSection.Leave();
  43. return result;
  44. }
  45. public void DisconnectFromPort()
  46. {
  47. if (ParentPort != null)
  48. {
  49. ParentPort.Disconnect();
  50. ParentPort.DecrementReferenceCount();
  51. }
  52. }
  53. protected override void Destroy()
  54. {
  55. _parent.DisconnectClient();
  56. _parent.DecrementReferenceCount();
  57. }
  58. }
  59. }