ServiceTable.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using Ryujinx.Horizon.Arp;
  2. using Ryujinx.Horizon.Audio;
  3. using Ryujinx.Horizon.Bcat;
  4. using Ryujinx.Horizon.Friends;
  5. using Ryujinx.Horizon.Hshl;
  6. using Ryujinx.Horizon.Ins;
  7. using Ryujinx.Horizon.Lbl;
  8. using Ryujinx.Horizon.LogManager;
  9. using Ryujinx.Horizon.MmNv;
  10. using Ryujinx.Horizon.Ngc;
  11. using Ryujinx.Horizon.Ovln;
  12. using Ryujinx.Horizon.Prepo;
  13. using Ryujinx.Horizon.Psc;
  14. using Ryujinx.Horizon.Ptm;
  15. using Ryujinx.Horizon.Sdk.Arp;
  16. using Ryujinx.Horizon.Srepo;
  17. using Ryujinx.Horizon.Usb;
  18. using Ryujinx.Horizon.Wlan;
  19. using System.Collections.Generic;
  20. using System.Threading;
  21. namespace Ryujinx.Horizon
  22. {
  23. public class ServiceTable
  24. {
  25. private int _readyServices;
  26. private int _totalServices;
  27. private readonly ManualResetEvent _servicesReadyEvent = new(false);
  28. public IReader ArpReader { get; internal set; }
  29. public IWriter ArpWriter { get; internal set; }
  30. public IEnumerable<ServiceEntry> GetServices(HorizonOptions options)
  31. {
  32. List<ServiceEntry> entries = new();
  33. void RegisterService<T>() where T : IService
  34. {
  35. entries.Add(new ServiceEntry(T.Main, this, options));
  36. }
  37. RegisterService<ArpMain>();
  38. RegisterService<AudioMain>();
  39. RegisterService<BcatMain>();
  40. RegisterService<FriendsMain>();
  41. RegisterService<HshlMain>();
  42. RegisterService<HwopusMain>(); // TODO: Merge with audio once we can start multiple threads.
  43. RegisterService<InsMain>();
  44. RegisterService<LblMain>();
  45. RegisterService<LmMain>();
  46. RegisterService<MmNvMain>();
  47. RegisterService<NgcMain>();
  48. RegisterService<OvlnMain>();
  49. RegisterService<PrepoMain>();
  50. RegisterService<PscMain>();
  51. RegisterService<SrepoMain>();
  52. RegisterService<TsMain>();
  53. RegisterService<UsbMain>();
  54. RegisterService<WlanMain>();
  55. _totalServices = entries.Count;
  56. return entries;
  57. }
  58. internal void SignalServiceReady()
  59. {
  60. if (Interlocked.Increment(ref _readyServices) == _totalServices)
  61. {
  62. _servicesReadyEvent.Set();
  63. }
  64. }
  65. public void WaitServicesReady()
  66. {
  67. _servicesReadyEvent.WaitOne();
  68. }
  69. protected virtual void Dispose(bool disposing)
  70. {
  71. if (disposing)
  72. {
  73. _servicesReadyEvent.Dispose();
  74. }
  75. }
  76. public void Dispose()
  77. {
  78. Dispose(true);
  79. }
  80. }
  81. }