Pārlūkot izejas kodu

audio: device thread shouldn't touch `thread_alive` after object is free'd.

Reference Issue #8386.
Ryan C. Gordon 1 gadu atpakaļ
vecāks
revīzija
8ac5c84ad1
1 mainītis faili ar 8 papildinājumiem un 3 dzēšanām
  1. 8 3
      src/audio/SDL_audio.c

+ 8 - 3
src/audio/SDL_audio.c

@@ -790,15 +790,20 @@ void SDL_QuitAudio(void)
 
 void SDL_AudioThreadFinalize(SDL_AudioDevice *device)
 {
-    if (SDL_AtomicGet(&device->condemned)) {
+    const SDL_bool condemned = SDL_AtomicGet(&device->condemned) ? SDL_TRUE : SDL_FALSE;
+    if (condemned) {
         if (device->thread) {
             SDL_DetachThread(device->thread);  // no one is waiting for us, just detach ourselves.
             device->thread = NULL;
-            SDL_AtomicSet(&device->thread_alive, 0);
         }
-        DestroyPhysicalAudioDevice(device);
     }
+
+    // tell the world we're done touching this object (except if condemned, when we're the only thing that _can_ touch it).
     SDL_AtomicSet(&device->thread_alive, 0);
+
+    if (condemned) {  // nothing is coming to destroy this object, we have to do it as we exit.
+        DestroyPhysicalAudioDevice(device);
+    }
 }
 
 static void MixFloat32Audio(float *dst, const float *src, const int buffer_size)