KClientSession.cs 2.5 KB

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