From 987c3355518a5a7da4f28edc009d6c33c2a703ac Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 22 Jul 2014 23:12:21 -0400 Subject: [PATCH] Clarifying hard-to-understand piece of code. --- src/audio/SDL_audio.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index af8247c29..8791d29ec 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -205,22 +205,34 @@ SDL_AudioOpenDevice_Default(_THIS, const char *devname, int iscapture) return -1; } +static SDL_INLINE SDL_bool +is_in_audio_device_thread(SDL_AudioDevice * device) +{ + /* The device thread locks the same mutex, but not through the public API. + This check is in case the application, in the audio callback, + tries to lock the thread that we've already locked from the + device thread...just in case we only have non-recursive mutexes. */ + if (device->thread && (SDL_ThreadID() == device->threadid)) { + return SDL_TRUE; + } + + return SDL_FALSE; +} + static void SDL_AudioLockDevice_Default(SDL_AudioDevice * device) { - if (device->thread && (SDL_ThreadID() == device->threadid)) { - return; + if (!is_in_audio_device_thread(device)) { + SDL_LockMutex(device->mixer_lock); } - SDL_LockMutex(device->mixer_lock); } static void SDL_AudioUnlockDevice_Default(SDL_AudioDevice * device) { - if (device->thread && (SDL_ThreadID() == device->threadid)) { - return; + if (!is_in_audio_device_thread(device)) { + SDL_UnlockMutex(device->mixer_lock); } - SDL_UnlockMutex(device->mixer_lock); }