diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs index c2eed7a552..317b07e8fd 100644 --- a/src/ARMeilleure/Translation/PTC/Ptc.cs +++ b/src/ARMeilleure/Translation/PTC/Ptc.cs @@ -55,7 +55,7 @@ namespace ARMeilleure.Translation.PTC private readonly ulong _outerHeaderMagic; private readonly ulong _innerHeaderMagic; - private readonly ManualResetEvent _waitEvent; + private readonly ManualResetEventSlim _waitEvent; private readonly object _lock; @@ -85,7 +85,7 @@ namespace ARMeilleure.Translation.PTC _outerHeaderMagic = BinaryPrimitives.ReadUInt64LittleEndian(EncodingCache.UTF8NoBOM.GetBytes(OuterHeaderMagicString).AsSpan()); _innerHeaderMagic = BinaryPrimitives.ReadUInt64LittleEndian(EncodingCache.UTF8NoBOM.GetBytes(InnerHeaderMagicString).AsSpan()); - _waitEvent = new ManualResetEvent(true); + _waitEvent = new ManualResetEventSlim(true); _lock = new object(); @@ -1123,7 +1123,7 @@ namespace ARMeilleure.Translation.PTC private void Wait() { - _waitEvent.WaitOne(); + _waitEvent.WaitHandle.WaitOne(); } public void Dispose() diff --git a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs index 0fe78edab4..e58a28e606 100644 --- a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs +++ b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs @@ -39,7 +39,7 @@ namespace ARMeilleure.Translation.PTC private readonly ulong _outerHeaderMagic; - private readonly ManualResetEvent _waitEvent; + private readonly ManualResetEventSlim _waitEvent; private readonly object _lock; @@ -63,7 +63,7 @@ namespace ARMeilleure.Translation.PTC _outerHeaderMagic = BinaryPrimitives.ReadUInt64LittleEndian(EncodingCache.UTF8NoBOM.GetBytes(OuterHeaderMagicString).AsSpan()); - _waitEvent = new ManualResetEvent(true); + _waitEvent = new ManualResetEventSlim(true); _lock = new object(); @@ -421,7 +421,7 @@ namespace ARMeilleure.Translation.PTC public void Wait() { - _waitEvent.WaitOne(); + _waitEvent.WaitHandle.WaitOne(); } public void Dispose() diff --git a/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs b/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs index 01286992f7..0e7f6377f7 100644 --- a/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs @@ -14,8 +14,8 @@ namespace Ryujinx.Audio.Backends.OpenAL { private readonly ALDevice _device; private readonly ALContext _context; - private readonly ManualResetEvent _updateRequiredEvent; - private readonly ManualResetEvent _pauseEvent; + private readonly ManualResetEventSlim _updateRequiredEvent; + private readonly ManualResetEventSlim _pauseEvent; private readonly ConcurrentDictionary _sessions; private bool _stillRunning; private readonly Thread _updaterThread; @@ -43,8 +43,8 @@ namespace Ryujinx.Audio.Backends.OpenAL { _device = ALC.OpenDevice(""); _context = ALC.CreateContext(_device, new ALContextAttributes()); - _updateRequiredEvent = new ManualResetEvent(false); - _pauseEvent = new ManualResetEvent(true); + _updateRequiredEvent = new ManualResetEventSlim(false); + _pauseEvent = new ManualResetEventSlim(true); _sessions = new ConcurrentDictionary(); _stillRunning = true; @@ -106,12 +106,12 @@ namespace Ryujinx.Audio.Backends.OpenAL return _sessions.TryRemove(session, out _); } - public ManualResetEvent GetUpdateRequiredEvent() + public ManualResetEventSlim GetUpdateRequiredEvent() { return _updateRequiredEvent; } - public ManualResetEvent GetPauseEvent() + public ManualResetEventSlim GetPauseEvent() { return _pauseEvent; } diff --git a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs index e39bfe549a..6f75ef83e5 100644 --- a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs @@ -14,8 +14,8 @@ namespace Ryujinx.Audio.Backends.SDL2 { public class SDL2HardwareDeviceDriver : IHardwareDeviceDriver { - private readonly ManualResetEvent _updateRequiredEvent; - private readonly ManualResetEvent _pauseEvent; + private readonly ManualResetEventSlim _updateRequiredEvent; + private readonly ManualResetEventSlim _pauseEvent; private readonly ConcurrentDictionary _sessions; private readonly bool _supportSurroundConfiguration; @@ -31,8 +31,8 @@ namespace Ryujinx.Audio.Backends.SDL2 public SDL2HardwareDeviceDriver() { - _updateRequiredEvent = new ManualResetEvent(false); - _pauseEvent = new ManualResetEvent(true); + _updateRequiredEvent = new ManualResetEventSlim(false); + _pauseEvent = new ManualResetEventSlim(true); _sessions = new ConcurrentDictionary(); SDL2Driver.Instance.Initialize(); @@ -68,12 +68,12 @@ namespace Ryujinx.Audio.Backends.SDL2 return device != 0; } - public ManualResetEvent GetUpdateRequiredEvent() + public ManualResetEventSlim GetUpdateRequiredEvent() { return _updateRequiredEvent; } - public ManualResetEvent GetPauseEvent() + public ManualResetEventSlim GetPauseEvent() { return _pauseEvent; } diff --git a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs index 4eb75a578b..c6365c26aa 100644 --- a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs +++ b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs @@ -18,7 +18,7 @@ namespace Ryujinx.Audio.Backends.SDL2 private readonly ConcurrentQueue _queuedBuffers; private readonly DynamicRingBuffer _ringBuffer; private ulong _playedSampleCount; - private readonly ManualResetEvent _updateRequiredEvent; + private readonly ManualResetEventSlim _updateRequiredEvent; private uint _outputStream; private bool _hasSetupError; private readonly SDL_AudioCallback _callbackDelegate; diff --git a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceDriver.cs b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceDriver.cs index e3e5d29136..d786198924 100644 --- a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceDriver.cs @@ -14,8 +14,8 @@ namespace Ryujinx.Audio.Backends.SoundIo { private readonly SoundIoContext _audioContext; private readonly SoundIoDeviceContext _audioDevice; - private readonly ManualResetEvent _updateRequiredEvent; - private readonly ManualResetEvent _pauseEvent; + private readonly ManualResetEventSlim _updateRequiredEvent; + private readonly ManualResetEventSlim _pauseEvent; private readonly ConcurrentDictionary _sessions; private int _disposeState; @@ -41,8 +41,8 @@ namespace Ryujinx.Audio.Backends.SoundIo public SoundIoHardwareDeviceDriver() { _audioContext = SoundIoContext.Create(); - _updateRequiredEvent = new ManualResetEvent(false); - _pauseEvent = new ManualResetEvent(true); + _updateRequiredEvent = new ManualResetEventSlim(false); + _pauseEvent = new ManualResetEventSlim(true); _sessions = new ConcurrentDictionary(); _audioContext.Connect(); @@ -131,12 +131,12 @@ namespace Ryujinx.Audio.Backends.SoundIo return fallback ? defaultAudioDevice : null; } - public ManualResetEvent GetUpdateRequiredEvent() + public ManualResetEventSlim GetUpdateRequiredEvent() { return _updateRequiredEvent; } - public ManualResetEvent GetPauseEvent() + public ManualResetEventSlim GetPauseEvent() { return _pauseEvent; } diff --git a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs index e9cc6a8e1a..b33ada270c 100644 --- a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs +++ b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs @@ -19,7 +19,7 @@ namespace Ryujinx.Audio.Backends.SoundIo private SoundIoOutStreamContext _outputStream; private readonly DynamicRingBuffer _ringBuffer; private ulong _playedSampleCount; - private readonly ManualResetEvent _updateRequiredEvent; + private readonly ManualResetEventSlim _updateRequiredEvent; private float _volume; private int _disposeState; diff --git a/src/Ryujinx.Audio/AudioManager.cs b/src/Ryujinx.Audio/AudioManager.cs index 370d3d0980..3a02ba43c9 100644 --- a/src/Ryujinx.Audio/AudioManager.cs +++ b/src/Ryujinx.Audio/AudioManager.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Threading; namespace Ryujinx.Audio @@ -16,7 +17,7 @@ namespace Ryujinx.Audio /// /// Events signaled when the driver played audio buffers. /// - private readonly ManualResetEvent[] _updateRequiredEvents; + private readonly ManualResetEventSlim[] _updateRequiredEvents; /// /// Action to execute when the driver played audio buffers. @@ -35,12 +36,12 @@ namespace Ryujinx.Audio /// public AudioManager() { - _updateRequiredEvents = new ManualResetEvent[2]; + _updateRequiredEvents = new ManualResetEventSlim[2]; _actions = new Action[2]; _isRunning = false; // Termination event. - _updateRequiredEvents[1] = new ManualResetEvent(false); + _updateRequiredEvents[1] = new ManualResetEventSlim(false); _workerThread = new Thread(Update) { @@ -68,7 +69,7 @@ namespace Ryujinx.Audio /// The driver event that will get signaled by the device driver when an audio buffer finished playing/being captured /// The callback to call when an audio buffer finished playing /// The callback to call when an audio buffer was captured - public void Initialize(ManualResetEvent updatedRequiredEvent, Action outputCallback, Action inputCallback) + public void Initialize(ManualResetEventSlim updatedRequiredEvent, Action outputCallback, Action inputCallback) { lock (_lock) { @@ -85,7 +86,7 @@ namespace Ryujinx.Audio { while (_isRunning) { - int index = WaitHandle.WaitAny(_updateRequiredEvents); + int index = WaitHandle.WaitAny(_updateRequiredEvents.Select(x => x.WaitHandle).ToArray()); // Last index is here to indicate thread termination. if (index + 1 == _updateRequiredEvents.Length) diff --git a/src/Ryujinx.Audio/Backends/CompatLayer/CompatLayerHardwareDeviceDriver.cs b/src/Ryujinx.Audio/Backends/CompatLayer/CompatLayerHardwareDeviceDriver.cs index a2c2cdcd0d..a1b9daa771 100644 --- a/src/Ryujinx.Audio/Backends/CompatLayer/CompatLayerHardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio/Backends/CompatLayer/CompatLayerHardwareDeviceDriver.cs @@ -33,12 +33,12 @@ namespace Ryujinx.Audio.Backends.CompatLayer _realDriver.Dispose(); } - public ManualResetEvent GetUpdateRequiredEvent() + public ManualResetEventSlim GetUpdateRequiredEvent() { return _realDriver.GetUpdateRequiredEvent(); } - public ManualResetEvent GetPauseEvent() + public ManualResetEventSlim GetPauseEvent() { return _realDriver.GetPauseEvent(); } diff --git a/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs b/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs index 3a3c1d1b14..ead639d607 100644 --- a/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs @@ -9,8 +9,8 @@ namespace Ryujinx.Audio.Backends.Dummy { public class DummyHardwareDeviceDriver : IHardwareDeviceDriver { - private readonly ManualResetEvent _updateRequiredEvent; - private readonly ManualResetEvent _pauseEvent; + private readonly ManualResetEventSlim _updateRequiredEvent; + private readonly ManualResetEventSlim _pauseEvent; public static bool IsSupported => true; @@ -18,8 +18,8 @@ namespace Ryujinx.Audio.Backends.Dummy public DummyHardwareDeviceDriver() { - _updateRequiredEvent = new ManualResetEvent(false); - _pauseEvent = new ManualResetEvent(true); + _updateRequiredEvent = new ManualResetEventSlim(false); + _pauseEvent = new ManualResetEventSlim(true); Volume = 1f; } @@ -44,12 +44,12 @@ namespace Ryujinx.Audio.Backends.Dummy return new DummyHardwareDeviceSessionInput(this, memoryManager); } - public ManualResetEvent GetUpdateRequiredEvent() + public ManualResetEventSlim GetUpdateRequiredEvent() { return _updateRequiredEvent; } - public ManualResetEvent GetPauseEvent() + public ManualResetEventSlim GetPauseEvent() { return _pauseEvent; } diff --git a/src/Ryujinx.Audio/Integration/IHardwareDeviceDriver.cs b/src/Ryujinx.Audio/Integration/IHardwareDeviceDriver.cs index 95b0e4e5e4..872b12ba5f 100644 --- a/src/Ryujinx.Audio/Integration/IHardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio/Integration/IHardwareDeviceDriver.cs @@ -20,8 +20,8 @@ namespace Ryujinx.Audio.Integration IHardwareDeviceSession OpenDeviceSession(Direction direction, IVirtualMemoryManager memoryManager, SampleFormat sampleFormat, uint sampleRate, uint channelCount); - ManualResetEvent GetUpdateRequiredEvent(); - ManualResetEvent GetPauseEvent(); + ManualResetEventSlim GetUpdateRequiredEvent(); + ManualResetEventSlim GetPauseEvent(); bool SupportsDirection(Direction direction); bool SupportsSampleRate(uint sampleRate); diff --git a/src/Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs b/src/Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs index 3e11df0566..7aa350f7a4 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/AudioProcessor.cs @@ -36,13 +36,13 @@ namespace Ryujinx.Audio.Renderer.Dsp private long _lastTime; private long _playbackEnds; - private readonly ManualResetEvent _event; + private readonly ManualResetEventSlim _event; - private ManualResetEvent _pauseEvent; + private ManualResetEventSlim _pauseEvent; public AudioProcessor() { - _event = new ManualResetEvent(false); + _event = new ManualResetEventSlim(false); } private static uint GetHardwareChannelCount(IHardwareDeviceDriver deviceDriver) @@ -157,7 +157,7 @@ namespace Ryujinx.Audio.Renderer.Dsp while (timeNow < _lastTime + increment) { - _event.WaitOne(1); + _event.WaitHandle.WaitOne(1); timeNow = PerformanceCounter.ElapsedNanoseconds; } @@ -189,7 +189,7 @@ namespace Ryujinx.Audio.Renderer.Dsp while (true) { - _pauseEvent?.WaitOne(); + _pauseEvent?.WaitHandle.WaitOne(); MailboxMessage message = _mailbox.ReceiveMessage(); @@ -204,10 +204,11 @@ namespace Ryujinx.Audio.Renderer.Dsp for (int i = 0; i < _sessionCommandList.Length; i++) { - if (_sessionCommandList[i] != null) + RendererSession rendererSession = _sessionCommandList[i]; + if (rendererSession != null) { - _sessionCommandList[i].CommandList.Process(OutputDevices[i]); - _sessionCommandList[i].CommandList.Dispose(); + rendererSession.CommandList.Process(OutputDevices[i]); + rendererSession.CommandList.Dispose(); _sessionCommandList[i] = null; } } diff --git a/src/Ryujinx.Graphics.Gpu/GpuContext.cs b/src/Ryujinx.Graphics.Gpu/GpuContext.cs index 048d32fb79..f2c96363ef 100644 --- a/src/Ryujinx.Graphics.Gpu/GpuContext.cs +++ b/src/Ryujinx.Graphics.Gpu/GpuContext.cs @@ -23,7 +23,7 @@ namespace Ryujinx.Graphics.Gpu /// /// Event signaled when the host emulation context is ready to be used by the gpu context. /// - public ManualResetEvent HostInitalized { get; } + public ManualResetEventSlim HostInitalized { get; } /// /// Host renderer. @@ -107,7 +107,7 @@ namespace Ryujinx.Graphics.Gpu private long _modifiedSequence; private readonly ulong _firstTimestamp; - private readonly ManualResetEvent _gpuReadyEvent; + private readonly ManualResetEventSlim _gpuReadyEvent; /// /// Creates a new instance of the GPU emulation context. @@ -123,8 +123,8 @@ namespace Ryujinx.Graphics.Gpu Window = new Window(this); - HostInitalized = new ManualResetEvent(false); - _gpuReadyEvent = new ManualResetEvent(false); + HostInitalized = new ManualResetEventSlim(false); + _gpuReadyEvent = new ManualResetEventSlim(false); SyncActions = new List(); SyncpointActions = new List(); @@ -276,7 +276,7 @@ namespace Ryujinx.Graphics.Gpu /// public void InitializeShaderCache(CancellationToken cancellationToken) { - HostInitalized.WaitOne(); + HostInitalized.WaitHandle.WaitOne(); foreach (var physicalMemory in PhysicalMemoryRegistry.Values) { @@ -291,7 +291,7 @@ namespace Ryujinx.Graphics.Gpu /// public void WaitUntilGpuReady() { - _gpuReadyEvent.WaitOne(); + _gpuReadyEvent.WaitHandle.WaitOne(); } /// diff --git a/src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs b/src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs index 1042a4db89..bcdadeb598 100644 --- a/src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs +++ b/src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs @@ -86,7 +86,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization timeout = TimeSpan.FromSeconds(1); } - using ManualResetEvent waitEvent = new(false); + using ManualResetEventSlim waitEvent = new(false); var info = _syncpoints[id].RegisterCallback(threshold, (x) => waitEvent.Set()); if (info == null) @@ -94,7 +94,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization return false; } - bool signaled = waitEvent.WaitOne(timeout); + bool signaled = waitEvent.WaitHandle.WaitOne(timeout); if (!signaled && info != null) { diff --git a/src/Ryujinx.Gtk3/UI/Applet/GtkHostUIHandler.cs b/src/Ryujinx.Gtk3/UI/Applet/GtkHostUIHandler.cs index b3f509a090..4da8f0b9ab 100644 --- a/src/Ryujinx.Gtk3/UI/Applet/GtkHostUIHandler.cs +++ b/src/Ryujinx.Gtk3/UI/Applet/GtkHostUIHandler.cs @@ -36,7 +36,7 @@ namespace Ryujinx.UI.Applet public bool DisplayMessageDialog(string title, string message) { - ManualResetEvent dialogCloseEvent = new(false); + ManualResetEventSlim dialogCloseEvent = new(false); bool okPressed = false; @@ -76,14 +76,14 @@ namespace Ryujinx.UI.Applet } }); - dialogCloseEvent.WaitOne(); + dialogCloseEvent.WaitHandle.WaitOne(); return okPressed; } public bool DisplayInputDialog(SoftwareKeyboardUIArgs args, out string userText) { - ManualResetEvent dialogCloseEvent = new(false); + ManualResetEventSlim dialogCloseEvent = new(false); bool okPressed = false; bool error = false; @@ -129,7 +129,7 @@ namespace Ryujinx.UI.Applet } }); - dialogCloseEvent.WaitOne(); + dialogCloseEvent.WaitHandle.WaitOne(); ((MainWindow)_parent).RendererWidget.NpadManager.UnblockInputUpdates(); userText = error ? null : inputText; @@ -145,7 +145,7 @@ namespace Ryujinx.UI.Applet public bool DisplayErrorAppletDialog(string title, string message, string[] buttons) { - ManualResetEvent dialogCloseEvent = new(false); + ManualResetEventSlim dialogCloseEvent = new(false); bool showDetails = false; @@ -190,7 +190,7 @@ namespace Ryujinx.UI.Applet } }); - dialogCloseEvent.WaitOne(); + dialogCloseEvent.WaitHandle.WaitOne(); return showDetails; } diff --git a/src/Ryujinx.Gtk3/UI/MainWindow.cs b/src/Ryujinx.Gtk3/UI/MainWindow.cs index d1ca6ce6ab..9d1c3393d2 100644 --- a/src/Ryujinx.Gtk3/UI/MainWindow.cs +++ b/src/Ryujinx.Gtk3/UI/MainWindow.cs @@ -1044,7 +1044,7 @@ namespace Ryujinx.UI RendererWidget.Initialize(_emulationContext); - RendererWidget.WaitEvent.WaitOne(); + RendererWidget.WaitEvent.WaitHandle.WaitOne(); RendererWidget.Start(); diff --git a/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs b/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs index 0e636792db..0d1ca129d8 100644 --- a/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs +++ b/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs @@ -37,7 +37,7 @@ namespace Ryujinx.UI private const float MaxResolutionScale = 4.0f; // Max resolution hotkeys can scale to before wrapping. private const float VolumeDelta = 0.05f; - public ManualResetEvent WaitEvent { get; set; } + public ManualResetEventSlim WaitEvent { get; set; } public NpadManager NpadManager { get; } public TouchScreenManager TouchScreenManager { get; } public Switch Device { get; private set; } @@ -64,8 +64,8 @@ namespace Ryujinx.UI private KeyboardHotkeyState _prevHotkeyState; - private readonly ManualResetEvent _exitEvent; - private readonly ManualResetEvent _gpuDoneEvent; + private readonly ManualResetEventSlim _exitEvent; + private readonly ManualResetEventSlim _gpuDoneEvent; private readonly CancellationTokenSource _gpuCancellationTokenSource; @@ -91,7 +91,7 @@ namespace Ryujinx.UI TouchScreenManager = _inputManager.CreateTouchScreenManager(); _keyboardInterface = (IKeyboard)_inputManager.KeyboardDriver.GetGamepad("0"); - WaitEvent = new ManualResetEvent(false); + WaitEvent = new ManualResetEventSlim(false); _glLogLevel = glLogLevel; @@ -110,8 +110,8 @@ namespace Ryujinx.UI | EventMask.KeyPressMask | EventMask.KeyReleaseMask)); - _exitEvent = new ManualResetEvent(false); - _gpuDoneEvent = new ManualResetEvent(false); + _exitEvent = new ManualResetEventSlim(false); + _gpuDoneEvent = new ManualResetEventSlim(false); _gpuCancellationTokenSource = new CancellationTokenSource(); @@ -552,7 +552,7 @@ namespace Ryujinx.UI // NOTE: The render loop is allowed to stay alive until the renderer itself is disposed, as it may handle resource dispose. // We only need to wait for all commands submitted during the main gpu loop to be processed. - _gpuDoneEvent.WaitOne(); + _gpuDoneEvent.WaitHandle.WaitOne(); _gpuDoneEvent.Dispose(); nvidiaStutterWorkaround?.Join(); @@ -577,7 +577,7 @@ namespace Ryujinx.UI { _isActive = false; - _exitEvent.WaitOne(); + _exitEvent.WaitHandle.WaitOne(); _exitEvent.Dispose(); } } diff --git a/src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs b/src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs index d1e5fa9fc1..25bb29e2c9 100644 --- a/src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs +++ b/src/Ryujinx.Gtk3/UI/Windows/UserProfilesManagerWindow.cs @@ -28,7 +28,7 @@ namespace Ryujinx.UI.Windows private Gdk.RGBA _selectedColor; - private readonly ManualResetEvent _avatarsPreloadingEvent = new(false); + private readonly ManualResetEventSlim _avatarsPreloadingEvent = new(false); public UserProfilesManagerWindow(AccountManager accountManager, ContentManager contentManager, VirtualFileSystem virtualFileSystem) : base($"Ryujinx {Program.Version} - Manage User Profiles") { @@ -256,7 +256,7 @@ namespace Ryujinx.UI.Windows { if (_contentManager.GetCurrentFirmwareVersion() != null) { - _avatarsPreloadingEvent.WaitOne(); + _avatarsPreloadingEvent.WaitHandle.WaitOne(); } SelectProfileImage(); diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs index 64b08e3093..594f0d69a0 100644 --- a/src/Ryujinx.HLE/HOS/Horizon.cs +++ b/src/Ryujinx.HLE/HOS/Horizon.cs @@ -243,7 +243,7 @@ namespace Ryujinx.HLE.HOS // Wait until SM server thread is done with initialization, // only then doing connections to SM is safe. - SmServer.InitDone.WaitOne(); + SmServer.InitDone.WaitHandle.WaitOne(); BsdServer = new ServerBase(KernelContext, "BsdServer"); FsServer = new ServerBase(KernelContext, "FsServer"); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs index 3d67448828..5c8dea0fe6 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs @@ -51,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading // even if they are not scheduled on guest cores. if (currentThread != null && !currentThread.IsSchedulable && currentThread.Context.Running) { - currentThread.SchedulerWaitEvent.WaitOne(); + currentThread.SchedulerWaitEvent.WaitHandle.WaitOne(); } } } diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs index 8ef77902c2..b36fc2bb6f 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs @@ -312,11 +312,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (nextThread == null) { ActivateIdleThread(); - currentThread.SchedulerWaitEvent.WaitOne(); + currentThread.SchedulerWaitEvent.WaitHandle.WaitOne(); } else { - WaitHandle.SignalAndWait(nextThread.SchedulerWaitEvent, currentThread.SchedulerWaitEvent); + WaitHandle.SignalAndWait(nextThread.SchedulerWaitEvent.WaitHandle, currentThread.SchedulerWaitEvent.WaitHandle); } } else diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index 835bf5d405..25d6e9fdbb 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -18,9 +18,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public const int MaxWaitSyncObjects = 64; - private ManualResetEvent _schedulerWaitEvent; + private ManualResetEventSlim _schedulerWaitEvent; - public ManualResetEvent SchedulerWaitEvent => _schedulerWaitEvent; + public ManualResetEventSlim SchedulerWaitEvent => _schedulerWaitEvent; public Thread HostThread { get; private set; } @@ -1232,7 +1232,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { if (_schedulerWaitEvent == null) { - var schedulerWaitEvent = new ManualResetEvent(false); + var schedulerWaitEvent = new ManualResetEventSlim(false); if (Interlocked.Exchange(ref _schedulerWaitEvent, schedulerWaitEvent) == null) { @@ -1247,7 +1247,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading private void ThreadStart() { - _schedulerWaitEvent.WaitOne(); + _schedulerWaitEvent.WaitHandle.WaitOne(); KernelStatic.SetKernelContext(KernelContext, this); if (_customThreadStart != null) diff --git a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs index 5e18d79812..dd993851bd 100644 --- a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs +++ b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs @@ -54,7 +54,7 @@ namespace Ryujinx.HLE.HOS.Services private int _isDisposed = 0; - public ManualResetEvent InitDone { get; } + public ManualResetEventSlim InitDone { get; } public string Name { get; } public Func SmObjectFactory { get; } @@ -68,7 +68,7 @@ namespace Ryujinx.HLE.HOS.Services _responseDataStream = MemoryStreamManager.Shared.GetStream(); _responseDataWriter = new BinaryWriter(_responseDataStream); - InitDone = new ManualResetEvent(false); + InitDone = new ManualResetEventSlim(false); Name = name; SmObjectFactory = smObjectFactory; @@ -104,7 +104,7 @@ namespace Ryujinx.HLE.HOS.Services public void AddSessionObj(KServerSession serverSession, IpcService obj) { // Ensure that the sever loop is running. - InitDone.WaitOne(); + InitDone.WaitHandle.WaitOne(); _selfProcess.HandleTable.GenerateHandle(serverSession, out int serverSessionHandle); diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs index 5b9e6811d3..2d1d3796b7 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs @@ -14,8 +14,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public bool Blocking { get => !_flags.HasFlag(EventFdFlags.NonBlocking); set => throw new NotSupportedException(); } - public ManualResetEvent WriteEvent { get; } - public ManualResetEvent ReadEvent { get; } + public ManualResetEventSlim WriteEvent { get; } + public ManualResetEventSlim ReadEvent { get; } public EventFileDescriptor(ulong value, EventFdFlags flags) { @@ -27,8 +27,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl _value = value; _flags = flags; - WriteEvent = new ManualResetEvent(false); - ReadEvent = new ManualResetEvent(false); + WriteEvent = new ManualResetEventSlim(false); + ReadEvent = new ManualResetEventSlim(false); UpdateEventStates(); } diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptorPollManager.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptorPollManager.cs index a29554c359..a81ff6917c 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptorPollManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptorPollManager.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types; using System.Collections.Generic; +using System.Linq; using System.Threading; namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl @@ -28,7 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { updatedCount = 0; - List waiters = new(); + List waiters = new(); for (int i = 0; i < events.Count; i++) { @@ -60,7 +61,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } } - int index = WaitHandle.WaitAny(waiters.ToArray(), timeoutMilliseconds); + int index = WaitHandle.WaitAny(waiters.Select(x => x.WaitHandle).ToArray(), timeoutMilliseconds); if (index != WaitHandle.WaitTimeout) { @@ -72,7 +73,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl EventFileDescriptor socket = (EventFileDescriptor)evnt.FileDescriptor; - if (socket.ReadEvent.WaitOne(0)) + if (socket.ReadEvent.WaitHandle.WaitOne(0)) { if (evnt.Data.InputEvents.HasFlag(PollEventTypeMask.Input)) { @@ -86,7 +87,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } if ((evnt.Data.InputEvents.HasFlag(PollEventTypeMask.Output)) - && socket.WriteEvent.WaitOne(0)) + && socket.WriteEvent.WaitHandle.WaitOne(0)) { outputEvents |= PollEventTypeMask.Output; } diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx.Headless.SDL2/WindowBase.cs index 8768913f5a..9159789c6f 100644 --- a/src/Ryujinx.Headless.SDL2/WindowBase.cs +++ b/src/Ryujinx.Headless.SDL2/WindowBase.cs @@ -72,8 +72,8 @@ namespace Ryujinx.Headless.SDL2 private readonly Stopwatch _chrono; private readonly long _ticksPerFrame; private readonly CancellationTokenSource _gpuCancellationTokenSource; - private readonly ManualResetEvent _exitEvent; - private readonly ManualResetEvent _gpuDoneEvent; + private readonly ManualResetEventSlim _exitEvent; + private readonly ManualResetEventSlim _gpuDoneEvent; private long _ticks; private bool _isActive; @@ -102,8 +102,8 @@ namespace Ryujinx.Headless.SDL2 _chrono = new Stopwatch(); _ticksPerFrame = Stopwatch.Frequency / TargetFps; _gpuCancellationTokenSource = new CancellationTokenSource(); - _exitEvent = new ManualResetEvent(false); - _gpuDoneEvent = new ManualResetEvent(false); + _exitEvent = new ManualResetEventSlim(false); + _gpuDoneEvent = new ManualResetEventSlim(false); _aspectRatio = aspectRatio; _enableMouse = enableMouse; HostUITheme = new HeadlessHostUiTheme(); @@ -347,7 +347,7 @@ namespace Ryujinx.Headless.SDL2 _isStopped = true; _isActive = false; - _exitEvent.WaitOne(); + _exitEvent.WaitHandle.WaitOne(); _exitEvent.Dispose(); } @@ -458,7 +458,7 @@ namespace Ryujinx.Headless.SDL2 // NOTE: The render loop is allowed to stay alive until the renderer itself is disposed, as it may handle resource dispose. // We only need to wait for all commands submitted during the main gpu loop to be processed. - _gpuDoneEvent.WaitOne(); + _gpuDoneEvent.WaitHandle.WaitOne(); _gpuDoneEvent.Dispose(); nvidiaStutterWorkaround?.Join(); diff --git a/src/Ryujinx.Horizon/ServiceTable.cs b/src/Ryujinx.Horizon/ServiceTable.cs index 28c43a716f..cb3babcc32 100644 --- a/src/Ryujinx.Horizon/ServiceTable.cs +++ b/src/Ryujinx.Horizon/ServiceTable.cs @@ -26,7 +26,7 @@ namespace Ryujinx.Horizon private int _readyServices; private int _totalServices; - private readonly ManualResetEvent _servicesReadyEvent = new(false); + private readonly ManualResetEventSlim _servicesReadyEvent = new(false); public IReader ArpReader { get; internal set; } public IWriter ArpWriter { get; internal set; } @@ -74,7 +74,7 @@ namespace Ryujinx.Horizon public void WaitServicesReady() { - _servicesReadyEvent.WaitOne(); + _servicesReadyEvent.WaitHandle.WaitOne(); } protected virtual void Dispose(bool disposing) diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index d405f32050..1710e86946 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -110,7 +110,7 @@ namespace Ryujinx.Ava private bool _isActive; private bool _renderingStarted; - private readonly ManualResetEvent _gpuDoneEvent; + private readonly ManualResetEventSlim _gpuDoneEvent; private IRenderer _renderer; private readonly Thread _renderingThread; @@ -207,7 +207,7 @@ namespace Ryujinx.Ava ConfigurationState.Instance.Multiplayer.Mode.Event += UpdateMultiplayerModeState; _gpuCancellationTokenSource = new CancellationTokenSource(); - _gpuDoneEvent = new ManualResetEvent(false); + _gpuDoneEvent = new ManualResetEventSlim(false); } private void TopLevel_PointerEnteredOrMoved(object sender, PointerEventArgs e) @@ -513,7 +513,7 @@ namespace Ryujinx.Ava // NOTE: The render loop is allowed to stay alive until the renderer itself is disposed, as it may handle resource dispose. // We only need to wait for all commands submitted during the main gpu loop to be processed. - _gpuDoneEvent.WaitOne(); + _gpuDoneEvent.WaitHandle.WaitOne(); _gpuDoneEvent.Dispose(); DisplaySleep.Restore(); diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs index 4bcf8eb949..38e1df0499 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -29,7 +29,7 @@ namespace Ryujinx.Ava.UI.Applet public bool DisplayMessageDialog(ControllerAppletUIArgs args) { - ManualResetEvent dialogCloseEvent = new(false); + ManualResetEventSlim dialogCloseEvent = new(false); bool okPressed = false; @@ -44,14 +44,14 @@ namespace Ryujinx.Ava.UI.Applet dialogCloseEvent.Set(); }); - dialogCloseEvent.WaitOne(); + dialogCloseEvent.WaitHandle.WaitOne(); return okPressed; } public bool DisplayMessageDialog(string title, string message) { - ManualResetEvent dialogCloseEvent = new(false); + ManualResetEventSlim dialogCloseEvent = new(false); bool okPressed = false; @@ -59,7 +59,7 @@ namespace Ryujinx.Ava.UI.Applet { try { - ManualResetEvent deferEvent = new(false); + ManualResetEventSlim deferEvent = new(false); bool opened = false; @@ -105,14 +105,14 @@ namespace Ryujinx.Ava.UI.Applet } }); - dialogCloseEvent.WaitOne(); + dialogCloseEvent.WaitHandle.WaitOne(); return okPressed; } public bool DisplayInputDialog(SoftwareKeyboardUIArgs args, out string userText) { - ManualResetEvent dialogCloseEvent = new(false); + ManualResetEventSlim dialogCloseEvent = new(false); bool okPressed = false; bool error = false; @@ -143,7 +143,7 @@ namespace Ryujinx.Ava.UI.Applet } }); - dialogCloseEvent.WaitOne(); + dialogCloseEvent.WaitHandle.WaitOne(); _parent.ViewModel.AppHost.NpadManager.UnblockInputUpdates(); userText = error ? null : inputText; @@ -159,7 +159,7 @@ namespace Ryujinx.Ava.UI.Applet public bool DisplayErrorAppletDialog(string title, string message, string[] buttons) { - ManualResetEvent dialogCloseEvent = new(false); + ManualResetEventSlim dialogCloseEvent = new(false); bool showDetails = false; @@ -193,7 +193,7 @@ namespace Ryujinx.Ava.UI.Applet } }); - dialogCloseEvent.WaitOne(); + dialogCloseEvent.WaitHandle.WaitOne(); return showDetails; } diff --git a/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs b/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs index 15b7ddd14b..7b21eb7a66 100644 --- a/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs +++ b/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs @@ -27,7 +27,7 @@ namespace Ryujinx.Ava.UI.Helpers string secondaryButton, string closeButton, UserResult primaryButtonResult = UserResult.Ok, - ManualResetEvent deferResetEvent = null, + ManualResetEventSlim deferResetEvent = null, TypedEventHandler deferCloseAction = null) { UserResult result = UserResult.None; @@ -76,7 +76,7 @@ namespace Ryujinx.Ava.UI.Helpers string closeButton, int iconSymbol, UserResult primaryButtonResult = UserResult.Ok, - ManualResetEvent deferResetEvent = null, + ManualResetEventSlim deferResetEvent = null, TypedEventHandler deferCloseAction = null) { Grid content = CreateTextDialogContent(primaryText, secondaryText, iconSymbol); @@ -93,7 +93,7 @@ namespace Ryujinx.Ava.UI.Helpers string secondaryButton, string closeButton, int iconSymbol, - ManualResetEvent deferResetEvent, + ManualResetEventSlim deferResetEvent, Func doWhileDeferred = null) { bool startedDeferring = false; @@ -127,7 +127,7 @@ namespace Ryujinx.Ava.UI.Helpers _ = Task.Run(() => { - deferResetEvent.WaitOne(); + deferResetEvent.WaitHandle.WaitOne(); Dispatcher.UIThread.Post(() => {