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 }