audio: device thread shouldn't touch thread_alive after object is free'd.
Reference Issue #8386.
This commit is contained in:
@@ -790,15 +790,20 @@ void SDL_QuitAudio(void)
|
|||||||
|
|
||||||
void SDL_AudioThreadFinalize(SDL_AudioDevice *device)
|
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) {
|
if (device->thread) {
|
||||||
SDL_DetachThread(device->thread); // no one is waiting for us, just detach ourselves.
|
SDL_DetachThread(device->thread); // no one is waiting for us, just detach ourselves.
|
||||||
device->thread = NULL;
|
device->thread = NULL;
|
||||||
SDL_AtomicSet(&device->thread_alive, 0);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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);
|
DestroyPhysicalAudioDevice(device);
|
||||||
}
|
}
|
||||||
SDL_AtomicSet(&device->thread_alive, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MixFloat32Audio(float *dst, const float *src, const int buffer_size)
|
static void MixFloat32Audio(float *dst, const float *src, const int buffer_size)
|
||||||
|
|||||||
Reference in New Issue
Block a user