KServerPort.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using Ryujinx.HLE.HOS.Kernel.Common;
  2. using System.Collections.Generic;
  3. namespace Ryujinx.HLE.HOS.Kernel.Ipc
  4. {
  5. class KServerPort : KSynchronizationObject
  6. {
  7. private LinkedList<KServerSession> _incomingConnections;
  8. private LinkedList<KLightServerSession> _lightIncomingConnections;
  9. private KPort _parent;
  10. public bool IsLight => _parent.IsLight;
  11. public KServerPort(Horizon system, KPort parent) : base(system)
  12. {
  13. _parent = parent;
  14. _incomingConnections = new LinkedList<KServerSession>();
  15. _lightIncomingConnections = new LinkedList<KLightServerSession>();
  16. }
  17. public void EnqueueIncomingSession(KServerSession session)
  18. {
  19. AcceptIncomingConnection(_incomingConnections, session);
  20. }
  21. public void EnqueueIncomingLightSession(KLightServerSession session)
  22. {
  23. AcceptIncomingConnection(_lightIncomingConnections, session);
  24. }
  25. private void AcceptIncomingConnection<T>(LinkedList<T> list, T session)
  26. {
  27. System.CriticalSection.Enter();
  28. list.AddLast(session);
  29. if (list.Count == 1)
  30. {
  31. Signal();
  32. }
  33. System.CriticalSection.Leave();
  34. }
  35. public KServerSession AcceptIncomingConnection()
  36. {
  37. return AcceptIncomingConnection(_incomingConnections);
  38. }
  39. public KLightServerSession AcceptIncomingLightConnection()
  40. {
  41. return AcceptIncomingConnection(_lightIncomingConnections);
  42. }
  43. private T AcceptIncomingConnection<T>(LinkedList<T> list)
  44. {
  45. T session = default(T);
  46. System.CriticalSection.Enter();
  47. if (list.Count != 0)
  48. {
  49. session = list.First.Value;
  50. list.RemoveFirst();
  51. }
  52. System.CriticalSection.Leave();
  53. return session;
  54. }
  55. public override bool IsSignaled()
  56. {
  57. if (_parent.IsLight)
  58. {
  59. return _lightIncomingConnections.Count != 0;
  60. }
  61. else
  62. {
  63. return _incomingConnections.Count != 0;
  64. }
  65. }
  66. }
  67. }