Add pthread_once() equivalent support.

git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1357 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Pierre Ossman 2006-09-01 18:39:55 +00:00
parent 3571bf1699
commit f84c65ed86
3 changed files with 55 additions and 31 deletions

View file

@ -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;