use priority inheritance on mutexes where applicable

git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1837 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2007-09-17 00:32:51 +00:00
parent 61b90a0951
commit 2741685d3a
10 changed files with 48 additions and 15 deletions

View file

@ -297,6 +297,22 @@ AC_CHECK_FUNCS([setresuid setresgid setreuid setregid seteuid setegid ppoll])
ACX_PTHREAD ACX_PTHREAD
AC_MSG_CHECKING([for PTHREAD_PRIO_INHERIT])
AC_LANG_CONFTEST([AC_LANG_SOURCE([[
#include <pthread.h>
int main() { int i = PTHREAD_PRIO_INHERIT; }]])])
$PTHREAD_CC conftest.c $PTHREAD_CFLAGS $CFLAGS $PTHREAD_LIBS -o conftest > /dev/null 2> /dev/null
ret=$?
rm -f conftest.o conftest
if test $ret -eq 0 ; then
AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.])
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
#### Large File-Support (LFS) #### #### Large File-Support (LFS) ####
AC_SYS_LARGEFILE AC_SYS_LARGEFILE

View file

@ -330,7 +330,7 @@ static const char *libtool_get_error(void) {
} }
static void libtool_init(void) { static void libtool_init(void) {
pa_assert_se(libtool_mutex = pa_mutex_new(1)); pa_assert_se(libtool_mutex = pa_mutex_new(TRUE, FALSE));
pa_assert_se(lt_dlmutex_register(libtool_lock, libtool_unlock, libtool_set_error, libtool_get_error) == 0); pa_assert_se(lt_dlmutex_register(libtool_lock, libtool_unlock, libtool_set_error, libtool_get_error) == 0);
pa_assert_se(lt_dlinit() == 0); pa_assert_se(lt_dlinit() == 0);
} }

View file

@ -947,7 +947,7 @@ int pa__init(pa_module*m) {
u->thread_info.master = u->master = NULL; u->thread_info.master = u->master = NULL;
u->time_event = NULL; u->time_event = NULL;
u->adjust_time = DEFAULT_ADJUST_TIME; u->adjust_time = DEFAULT_ADJUST_TIME;
u->mutex = pa_mutex_new(0); u->mutex = pa_mutex_new(FALSE, TRUE);
pa_thread_mq_init(&u->thread_mq, m->core->mainloop); pa_thread_mq_init(&u->thread_mq, m->core->mainloop);
u->rtpoll = NULL; u->rtpoll = NULL;
u->thread = NULL; u->thread = NULL;

View file

@ -103,7 +103,7 @@ pa_threaded_mainloop *pa_threaded_mainloop_new(void) {
return NULL; return NULL;
} }
m->mutex = pa_mutex_new(1); m->mutex = pa_mutex_new(TRUE, FALSE);
m->cond = pa_cond_new(); m->cond = pa_cond_new();
m->accept_cond = pa_cond_new(); m->accept_cond = pa_cond_new();
m->thread = NULL; m->thread = NULL;

View file

@ -67,7 +67,7 @@ pa_asyncmsgq *pa_asyncmsgq_new(unsigned size) {
PA_REFCNT_INIT(a); PA_REFCNT_INIT(a);
pa_assert_se(a->asyncq = pa_asyncq_new(size)); pa_assert_se(a->asyncq = pa_asyncq_new(size));
pa_assert_se(a->mutex = pa_mutex_new(0)); pa_assert_se(a->mutex = pa_mutex_new(FALSE, TRUE));
a->current = NULL; a->current = NULL;
return a; return a;

View file

@ -660,7 +660,7 @@ pa_mempool* pa_mempool_new(int shared) {
p = pa_xnew(pa_mempool, 1); p = pa_xnew(pa_mempool, 1);
p->mutex = pa_mutex_new(1); p->mutex = pa_mutex_new(TRUE, TRUE);
p->semaphore = pa_semaphore_new(0); p->semaphore = pa_semaphore_new(0);
p->block_size = PA_PAGE_ALIGN(PA_MEMPOOL_SLOT_SIZE); p->block_size = PA_PAGE_ALIGN(PA_MEMPOOL_SLOT_SIZE);
@ -781,7 +781,7 @@ pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void
pa_assert(cb); pa_assert(cb);
i = pa_xnew(pa_memimport, 1); i = pa_xnew(pa_memimport, 1);
i->mutex = pa_mutex_new(1); i->mutex = pa_mutex_new(TRUE, TRUE);
i->pool = p; i->pool = p;
i->segments = pa_hashmap_new(NULL, NULL); i->segments = pa_hashmap_new(NULL, NULL);
i->blocks = pa_hashmap_new(NULL, NULL); i->blocks = pa_hashmap_new(NULL, NULL);
@ -909,18 +909,22 @@ finish:
int pa_memimport_process_revoke(pa_memimport *i, uint32_t id) { int pa_memimport_process_revoke(pa_memimport *i, uint32_t id) {
pa_memblock *b; pa_memblock *b;
int ret = 0;
pa_assert(i); pa_assert(i);
pa_mutex_lock(i->mutex); pa_mutex_lock(i->mutex);
if (!(b = pa_hashmap_get(i->blocks, PA_UINT32_TO_PTR(id)))) if (!(b = pa_hashmap_get(i->blocks, PA_UINT32_TO_PTR(id)))) {
return -1; ret = -1;
goto finish;
}
memblock_replace_import(b); memblock_replace_import(b);
finish:
pa_mutex_unlock(i->mutex); pa_mutex_unlock(i->mutex);
return 0; return ret;
} }
/* For sending blocks to other nodes */ /* For sending blocks to other nodes */
@ -934,7 +938,7 @@ pa_memexport* pa_memexport_new(pa_mempool *p, pa_memexport_revoke_cb_t cb, void
return NULL; return NULL;
e = pa_xnew(pa_memexport, 1); e = pa_xnew(pa_memexport, 1);
e->mutex = pa_mutex_new(1); e->mutex = pa_mutex_new(TRUE, TRUE);
e->pool = p; e->pool = p;
PA_LLIST_HEAD_INIT(struct memexport_slot, e->free_slots); PA_LLIST_HEAD_INIT(struct memexport_slot, e->free_slots);
PA_LLIST_HEAD_INIT(struct memexport_slot, e->used_slots); PA_LLIST_HEAD_INIT(struct memexport_slot, e->used_slots);

View file

@ -40,7 +40,7 @@ struct pa_cond {
pthread_cond_t cond; pthread_cond_t cond;
}; };
pa_mutex* pa_mutex_new(int recursive) { pa_mutex* pa_mutex_new(pa_bool_t recursive, pa_bool_t inherit_priority) {
pa_mutex *m; pa_mutex *m;
pthread_mutexattr_t attr; pthread_mutexattr_t attr;
@ -49,6 +49,11 @@ pa_mutex* pa_mutex_new(int recursive) {
if (recursive) if (recursive)
pa_assert_se(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) == 0); 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);
#endif
m = pa_xnew(pa_mutex, 1); m = pa_xnew(pa_mutex, 1);
pa_assert_se(pthread_mutex_init(&m->mutex, &attr) == 0); pa_assert_se(pthread_mutex_init(&m->mutex, &attr) == 0);
return m; return m;

View file

@ -24,9 +24,17 @@
USA. USA.
***/ ***/
#include <pulsecore/macro.h>
typedef struct pa_mutex pa_mutex; typedef struct pa_mutex pa_mutex;
pa_mutex* pa_mutex_new(int recursive); /* Please think twice before enabling priority inheritance. This is no
* magic wand! Use it only when the potentially priorized threads are
* good candidates for it. Don't use this blindly! Also, note that
* only very few operating systems actually implement this, hence this
* is merely a hint. */
pa_mutex* pa_mutex_new(pa_bool_t recursive, pa_bool_t inherit_priority);
void pa_mutex_free(pa_mutex *m); void pa_mutex_free(pa_mutex *m);
void pa_mutex_lock(pa_mutex *m); void pa_mutex_lock(pa_mutex *m);
void pa_mutex_unlock(pa_mutex *m); void pa_mutex_unlock(pa_mutex *m);

View file

@ -58,7 +58,7 @@ int pa_once_begin(pa_once *control) {
return 0; return 0;
} }
pa_assert_se(m = pa_mutex_new(0)); pa_assert_se(m = pa_mutex_new(FALSE, FALSE));
pa_mutex_lock(m); pa_mutex_lock(m);
if (pa_atomic_ptr_cmpxchg(&control->mutex, NULL, m)) if (pa_atomic_ptr_cmpxchg(&control->mutex, NULL, m))

View file

@ -98,7 +98,7 @@ int main(int argc, char *argv[]) {
assert(pa_thread_is_running(pa_thread_self())); assert(pa_thread_is_running(pa_thread_self()));
mutex = pa_mutex_new(0); mutex = pa_mutex_new(FALSE, FALSE);
cond1 = pa_cond_new(); cond1 = pa_cond_new();
cond2 = pa_cond_new(); cond2 = pa_cond_new();
tls = pa_tls_new(pa_xfree); tls = pa_tls_new(pa_xfree);