diff options
author | Mary <me@thog.eu> | 2021-06-29 19:37:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-29 19:37:13 +0200 |
commit | 00ce9eea620652b97b4d3e8cd9218c6fccff8b1c (patch) | |
tree | f488b1b378a8ecbeaf54d5a7916062784a5588dc /Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs | |
parent | fbb4019ed5c12c4a888c7b09db648ac595366896 (diff) |
Fix disposing of IPC sessions server at emulation stop (#2334)
Diffstat (limited to 'Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs')
-rw-r--r-- | Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs b/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs index 387ae772..721e96c6 100644 --- a/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs +++ b/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs @@ -133,19 +133,28 @@ namespace Ryujinx.Audio.Backends.OpenAL { if (disposing) { - lock (_lock) - { - _stillRunning = false; - _updaterThread.Join(); + _stillRunning = false; - // Loop against all sessions to dispose them (they will unregister themself) - while (_sessions.Count > 0) + int sessionCount = 0; + + // NOTE: This is done in a way to avoid possible situations when the OpenALHardwareDeviceSession is already being dispose in another thread but doesn't hold the lock and tries to Unregister. + do + { + lock (_lock) { - OpenALHardwareDeviceSession session = _sessions[0]; + if (_sessions.Count == 0) + { + break; + } + + OpenALHardwareDeviceSession session = _sessions[_sessions.Count - 1]; session.Dispose(); + + sessionCount = _sessions.Count; } } + while (sessionCount > 0); ALC.DestroyContext(_context); ALC.CloseDevice(_device); |