summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/thread-posix.c
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2006-09-01 18:39:55 +0000
committerPierre Ossman <ossman@cendio.se>2006-09-01 18:39:55 +0000
commitf84c65ed86ae59aae6e9a48e62aca31eaa30e2e3 (patch)
treed27831a798f4a4acf1815cbd13f1cd35108645b5 /src/pulsecore/thread-posix.c
parent3571bf1699d1fa42b5d24fcf62eea867f0fe9903 (diff)
Add pthread_once() equivalent support.
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1357 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/pulsecore/thread-posix.c')
-rw-r--r--src/pulsecore/thread-posix.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/pulsecore/thread-posix.c b/src/pulsecore/thread-posix.c
index 4c12ec93..bc71ea47 100644
--- a/src/pulsecore/thread-posix.c
+++ b/src/pulsecore/thread-posix.c
@@ -30,6 +30,7 @@
#include <atomic_ops.h>
#include <pulse/xmalloc.h>
+#include <pulsecore/mutex.h>
#include "thread.h"
@@ -52,6 +53,9 @@ struct pa_tls {
static pa_tls *thread_tls;
static pthread_once_t thread_tls_once = PTHREAD_ONCE_INIT;
+static pa_mutex *once_mutex;
+static pthread_once_t thread_once_once = PTHREAD_ONCE_INIT;
+
static void thread_tls_once_func(void) {
thread_tls = pa_tls_new(NULL);
assert(thread_tls);
@@ -125,6 +129,27 @@ void pa_thread_yield(void) {
#endif
}
+static void thread_once_once_func(void) {
+ once_mutex = pa_mutex_new();
+ assert(once_mutex);
+}
+
+void pa_thread_once(pa_thread_once_t *control, pa_thread_once_func_t once_func) {
+ assert(control);
+ assert(once_func);
+
+ ASSERT_SUCCESS(pthread_once(&thread_once_once, thread_once_once_func));
+
+ pa_mutex_lock(once_mutex);
+
+ if (*control == PA_THREAD_ONCE_INIT) {
+ *control = ~PA_THREAD_ONCE_INIT;
+ pa_mutex_unlock(once_mutex);
+ once_func();
+ } else
+ pa_mutex_unlock(once_mutex);
+}
+
pa_tls* pa_tls_new(pa_free_cb_t free_cb) {
pa_tls *t;