X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/8972d06bc78ec61792a4c423f19df18f8f8a5838..dcd4a73df94b0e9083f72d79f81083961bd15746:/src/pulsecore/rtsig.c diff --git a/src/pulsecore/rtsig.c b/src/pulsecore/rtsig.c index 1b8cdaa3..4cd6aa8f 100644 --- a/src/pulsecore/rtsig.c +++ b/src/pulsecore/rtsig.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of PulseAudio. @@ -32,14 +30,17 @@ #include #include #include +#include #include "rtsig.h" +#ifdef SIGRTMIN + static void _free_rtsig(void *p) { pa_rtsig_put(PA_PTR_TO_INT(p)); } -PA_STATIC_FLIST_DECLARE(rtsig_flist, pa_make_power_of_two(SIGRTMAX-SIGRTMIN+1), NULL); +PA_STATIC_FLIST_DECLARE(rtsig_flist, pa_make_power_of_two((unsigned) (SIGRTMAX-SIGRTMIN+1)), NULL); PA_STATIC_TLS_DECLARE(rtsig_tls, _free_rtsig); static pa_atomic_t rtsig_current = PA_ATOMIC_INIT(-1); @@ -49,17 +50,17 @@ static int rtsig_start = -1, rtsig_end = -1; int pa_rtsig_get(void) { void *p; int sig; - + if ((p = pa_flist_pop(PA_STATIC_FLIST_GET(rtsig_flist)))) return PA_PTR_TO_INT(p); - sig = pa_atomic_inc(&rtsig_current); + sig = pa_atomic_dec(&rtsig_current); - pa_assert(sig >= SIGRTMIN); - pa_assert(sig >= rtsig_start); - - if (sig > rtsig_end) { - pa_atomic_dec(&rtsig_current); + pa_assert(sig <= SIGRTMAX); + pa_assert(sig <= rtsig_end); + + if (sig < rtsig_start) { + pa_atomic_inc(&rtsig_current); return -1; } @@ -70,13 +71,13 @@ int pa_rtsig_get_for_thread(void) { int sig; void *p; - if ((p = pa_tls_get(PA_STATIC_TLS_GET(rtsig_tls)))) + if ((p = PA_STATIC_TLS_GET(rtsig_tls))) return PA_PTR_TO_INT(p); - + if ((sig = pa_rtsig_get()) < 0) return -1; - pa_tls_set(PA_STATIC_TLS_GET(rtsig_tls), PA_INT_TO_PTR(sig)); + PA_STATIC_TLS_SET(rtsig_tls, PA_INT_TO_PTR(sig)); return sig; } @@ -101,11 +102,30 @@ void pa_rtsig_configure(int start, int end) { rtsig_end = end; sigemptyset(&ss); - + for (s = rtsig_start; s <= rtsig_end; s++) pa_assert_se(sigaddset(&ss, s) == 0); - + pa_assert(pthread_sigmask(SIG_BLOCK, &ss, NULL) == 0); - - pa_atomic_store(&rtsig_current, rtsig_start); + + /* We allocate starting from the end */ + pa_atomic_store(&rtsig_current, rtsig_end); +} + +#else /* SIGRTMIN */ + +int pa_rtsig_get(void) { + return -1; +} + +int pa_rtsig_get_for_thread(void) { + return -1; +} + +void pa_rtsig_put(int sig) { +} + +void pa_rtsig_configure(int start, int end) { } + +#endif /* SIGRTMIN */