From: Peter Meerwald <p.meerwald@xxxxxxxxxxxxxxxxxx> v2: (thanks David Henningsson) * keep attribute order * rename function Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net> --- src/pulsecore/once.c | 18 +----------------- src/pulsecore/once.h | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/pulsecore/once.c b/src/pulsecore/once.c index 16059c3..066c24c 100644 --- a/src/pulsecore/once.c +++ b/src/pulsecore/once.c @@ -30,14 +30,9 @@ /* See http://www.hpl.hp.com/research/linux/atomic_ops/example.php4 for the * reference algorithm used here. */ -bool pa_once_begin(pa_once *control) { +bool pa_once_begin_internal(pa_once *control) { pa_mutex *m; - pa_assert(control); - - if (pa_atomic_load(&control->done)) - return false; - /* Caveat: We have to make sure that the once func has completed * before returning, even if the once func is not actually * executed by us. Hence the awkward locking. */ @@ -64,14 +59,3 @@ void pa_once_end(pa_once *control) { m = pa_static_mutex_get(&control->mutex, false, false); pa_mutex_unlock(m); } - -/* Not reentrant -- how could it be? */ -void pa_run_once(pa_once *control, pa_once_func_t func) { - pa_assert(control); - pa_assert(func); - - if (pa_once_begin(control)) { - func(); - pa_once_end(control); - } -} diff --git a/src/pulsecore/once.h b/src/pulsecore/once.h index 460a700..be7443e 100644 --- a/src/pulsecore/once.h +++ b/src/pulsecore/once.h @@ -33,11 +33,20 @@ typedef struct pa_once { #define PA_ONCE_INIT \ { \ .mutex = PA_STATIC_MUTEX_INIT, \ - .done = PA_ATOMIC_INIT(0) \ + .done = PA_ATOMIC_INIT(0), \ } /* Not to be called directly, use the macros defined below instead */ -bool pa_once_begin(pa_once *o); +bool pa_once_begin_internal(pa_once *control); + +static inline bool pa_once_begin(pa_once *control) { + pa_assert(control); + + if (pa_atomic_load(&control->done)) + return false; + + return pa_once_begin_internal(control); +} void pa_once_end(pa_once *o); #define PA_ONCE_BEGIN \ @@ -68,6 +77,16 @@ void pa_once_end(pa_once *o); /* Same API but calls a function */ typedef void (*pa_once_func_t) (void); -void pa_run_once(pa_once *o, pa_once_func_t f); + +/* Not reentrant -- how could it be? */ +static inline void pa_run_once(pa_once *control, pa_once_func_t func) { + pa_assert(control); + pa_assert(func); + + if (pa_once_begin(control)) { + func(); + pa_once_end(control); + } +} #endif -- 1.9.1