]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsaloop: pcmjob.c: use portable way to initialize recursive mutex
authorJohn Spencer <maillist-alsa@barfooze.de>
Fri, 8 Nov 2013 12:59:41 +0000 (13:59 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 8 Nov 2013 13:57:06 +0000 (14:57 +0100)
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP is not in POSIX, as _NP
(non-portable) suggests.

exposing such a symbol in musl libc would lock in the ABI for all
times and makes it impossible to do future changes to the under-
lying struct without hideous symbol versioning hacks.

use the portable way instead: pthread_once was designed for such
cases.

Signed-off-by: John Spencer <maillist-alsa@barfooze.de>
Tested-by: John Spencer <maillist-alsa@barfooze.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
alsaloop/pcmjob.c

index 139b6fdf087ec3e6ad05c039a8a33d08d7106fe3..f32180c8e8cdeb6b36ab869cfb93fa3c1d2514b2 100644 (file)
@@ -62,11 +62,22 @@ static const char *src_types[] = {
 };
 #endif
 
-static pthread_mutex_t pcm_open_mutex =
-                                PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+static pthread_once_t pcm_open_mutex_once = PTHREAD_ONCE_INIT;
+static pthread_mutex_t pcm_open_mutex;
+
+static void pcm_open_init_mutex(void)
+{
+       pthread_mutexattr_t attr;
+
+       pthread_mutexattr_init(&attr);
+       pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+       pthread_mutex_init(&pcm_open_mutex, &attr);
+       pthread_mutexattr_destroy(&attr);
+}
 
 static inline void pcm_open_lock(void)
 {
+       pthread_once(&pcm_open_mutex_once, pcm_open_init_mutex);
        if (workarounds & WORKAROUND_SERIALOPEN)
                pthread_mutex_lock(&pcm_open_mutex);
 }