diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-09-18 19:51:26 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-09-18 19:51:26 +0000 |
commit | ca717643ee768307475fc36ea29d920a13db0a8e (patch) | |
tree | c6486b2808da51e09dad796ebeb06e5dc5834603 | |
parent | a558e9312e440bc674fdda627edb31dd989c38a5 (diff) |
If PTHREAD_PRIO_INHERIT mutexes are not available fall back to normal mutexes
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1856 fefdeb5f-60dc-0310-8127-8f9354f1896f
-rw-r--r-- | src/pulsecore/mutex-posix.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/pulsecore/mutex-posix.c b/src/pulsecore/mutex-posix.c index 19e095bb..805f11de 100644 --- a/src/pulsecore/mutex-posix.c +++ b/src/pulsecore/mutex-posix.c @@ -26,9 +26,12 @@ #endif #include <pthread.h> +#include <errno.h> #include <pulse/xmalloc.h> #include <pulsecore/macro.h> +#include <pulsecore/log.h> +#include <pulsecore/core-error.h> #include "mutex.h" @@ -43,19 +46,36 @@ struct pa_cond { pa_mutex* pa_mutex_new(pa_bool_t recursive, pa_bool_t inherit_priority) { pa_mutex *m; pthread_mutexattr_t attr; + int r; - pthread_mutexattr_init(&attr); + pa_assert_se(pthread_mutexattr_init(&attr) == 0); if (recursive) pa_assert_se(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) == 0); #ifdef HAVE_PTHREAD_PRIO_INHERIT if (inherit_priority) - pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT); + pa_assert_se(pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT) == 0); #endif m = pa_xnew(pa_mutex, 1); + +#ifndef HAVE_PTHREAD_PRIO_INHERIT pa_assert_se(pthread_mutex_init(&m->mutex, &attr) == 0); + +#else + if ((r = pthread_mutex_init(&m->mutex, &attr))) { + + /* If this failed, then this was probably due to non-available + * priority inheritance. In which case we fall back to normal + * mutexes. */ + pa_assert(r == ENOTSUP && inherit_priority); + + pa_assert_se(pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_NONE) == 0); + pa_assert_se(pthread_mutex_init(&m->mutex, &attr) == 0); + } +#endif + return m; } |