-/* $Id$ */
-
/***
This file is part of PulseAudio.
#include <pulsecore/flist.h>
#include <pulsecore/once.h>
#include <pulsecore/thread.h>
+#include <pulsecore/core-util.h>
#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);
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;
}
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;
}
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 */