mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-12-22 08:56:52 -05:00
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:
parent
3571bf1699
commit
f84c65ed86
3 changed files with 55 additions and 31 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue