Clarifying hard-to-understand piece of code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c
index af8247c..8791d29 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);
}