aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs
diff options
context:
space:
mode:
authorMary <me@thog.eu>2021-06-29 19:37:13 +0200
committerGitHub <noreply@github.com>2021-06-29 19:37:13 +0200
commit00ce9eea620652b97b4d3e8cd9218c6fccff8b1c (patch)
treef488b1b378a8ecbeaf54d5a7916062784a5588dc /Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs
parentfbb4019ed5c12c4a888c7b09db648ac595366896 (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.cs23
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);