KPort.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Ryujinx.HLE.HOS.Kernel.Common;
  2. using Ryujinx.Horizon.Common;
  3. namespace Ryujinx.HLE.HOS.Kernel.Ipc
  4. {
  5. class KPort : KAutoObject
  6. {
  7. public KServerPort ServerPort { get; }
  8. public KClientPort ClientPort { get; }
  9. private string _name;
  10. private ChannelState _state;
  11. public bool IsLight { get; private set; }
  12. public KPort(KernelContext context, int maxSessions, bool isLight, string name) : base(context)
  13. {
  14. ServerPort = new KServerPort(context, this);
  15. ClientPort = new KClientPort(context, this, maxSessions);
  16. IsLight = isLight;
  17. _name = name;
  18. _state = ChannelState.Open;
  19. }
  20. public Result EnqueueIncomingSession(KServerSession session)
  21. {
  22. Result result;
  23. KernelContext.CriticalSection.Enter();
  24. if (_state == ChannelState.Open)
  25. {
  26. ServerPort.EnqueueIncomingSession(session);
  27. result = Result.Success;
  28. }
  29. else
  30. {
  31. result = KernelResult.PortClosed;
  32. }
  33. KernelContext.CriticalSection.Leave();
  34. return result;
  35. }
  36. public Result EnqueueIncomingLightSession(KLightServerSession session)
  37. {
  38. Result result;
  39. KernelContext.CriticalSection.Enter();
  40. if (_state == ChannelState.Open)
  41. {
  42. ServerPort.EnqueueIncomingLightSession(session);
  43. result = Result.Success;
  44. }
  45. else
  46. {
  47. result = KernelResult.PortClosed;
  48. }
  49. KernelContext.CriticalSection.Leave();
  50. return result;
  51. }
  52. }
  53. }