using Ryujinx.Horizon.LogManager; using Ryujinx.Horizon.Prepo; using System.Collections.Generic; using System.Threading; namespace Ryujinx.Horizon { public class ServiceTable { private int _readyServices; private int _totalServices; private readonly ManualResetEvent _servicesReadyEvent = new(false); public IEnumerable GetServices(HorizonOptions options) { List entries = new(); void RegisterService() where T : IService { entries.Add(new ServiceEntry(T.Main, this, options)); } RegisterService(); RegisterService(); _totalServices = entries.Count; return entries; } internal void SignalServiceReady() { if (Interlocked.Increment(ref _readyServices) == _totalServices) { _servicesReadyEvent.Set(); } } public void WaitServicesReady() { _servicesReadyEvent.WaitOne(); } protected virtual void Dispose(bool disposing) { if (disposing) { _servicesReadyEvent.Dispose(); } } public void Dispose() { Dispose(true); } } }