/ src / Ryujinx.Horizon / ServiceTable.cs
ServiceTable.cs
 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  
22  namespace Ryujinx.Horizon
23  {
24      public class ServiceTable
25      {
26          private int _readyServices;
27          private int _totalServices;
28  
29          private readonly ManualResetEvent _servicesReadyEvent = new(false);
30  
31          public IReader ArpReader { get; internal set; }
32          public IWriter ArpWriter { get; internal set; }
33  
34          public IEnumerable<ServiceEntry> GetServices(HorizonOptions options)
35          {
36              List<ServiceEntry> entries = new();
37  
38              void RegisterService<T>() where T : IService
39              {
40                  entries.Add(new ServiceEntry(T.Main, this, options));
41              }
42  
43              RegisterService<ArpMain>();
44              RegisterService<AudioMain>();
45              RegisterService<BcatMain>();
46              RegisterService<FriendsMain>();
47              RegisterService<HshlMain>();
48              RegisterService<HwopusMain>(); // TODO: Merge with audio once we can start multiple threads.
49              RegisterService<InsMain>();
50              RegisterService<LblMain>();
51              RegisterService<LmMain>();
52              RegisterService<MmNvMain>();
53              RegisterService<NgcMain>();
54              RegisterService<OvlnMain>();
55              RegisterService<PrepoMain>();
56              RegisterService<PscMain>();
57              RegisterService<SrepoMain>();
58              RegisterService<TsMain>();
59              RegisterService<UsbMain>();
60              RegisterService<WlanMain>();
61  
62              _totalServices = entries.Count;
63  
64              return entries;
65          }
66  
67          internal void SignalServiceReady()
68          {
69              if (Interlocked.Increment(ref _readyServices) == _totalServices)
70              {
71                  _servicesReadyEvent.Set();
72              }
73          }
74  
75          public void WaitServicesReady()
76          {
77              _servicesReadyEvent.WaitOne();
78          }
79  
80          protected virtual void Dispose(bool disposing)
81          {
82              if (disposing)
83              {
84                  _servicesReadyEvent.Dispose();
85              }
86          }
87  
88          public void Dispose()
89          {
90              Dispose(true);
91          }
92      }
93  }