[pulseaudio-discuss] [PATCH RFCv2 21/27] once: Inline functions

David Henningsson david.henningsson at canonical.com
Mon Nov 3 00:28:55 PST 2014


Looks good in general, see comments below

On 2014-10-28 20:46, Peter Meerwald wrote:
> From: Peter Meerwald <p.meerwald at bct-electronic.com>

Missing a good commit message.

> Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net>
> ---
>   src/pulsecore/once.c | 18 +-----------------
>   src/pulsecore/once.h | 27 +++++++++++++++++++++++----
>   2 files changed, 24 insertions(+), 21 deletions(-)
>
> diff --git a/src/pulsecore/once.c b/src/pulsecore/once.c
> index 16059c3..cac8cda 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_doit(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..3d528a7 100644
> --- a/src/pulsecore/once.h
> +++ b/src/pulsecore/once.h
> @@ -26,18 +26,27 @@
>   #include <pulsecore/mutex.h>
>
>   typedef struct pa_once {
> -    pa_static_mutex mutex;
>       pa_atomic_t done;
> +    pa_static_mutex mutex;

Any particular reason these changed order?

>   } pa_once;
>
>   #define PA_ONCE_INIT                                                    \
>       {                                                                   \
> +        .done = PA_ATOMIC_INIT(0),                                      \
>           .mutex = PA_STATIC_MUTEX_INIT,                                  \
> -        .done = PA_ATOMIC_INIT(0)                                       \

Ditto

>       }
>
>   /* Not to be called directly, use the macros defined below instead */
> -bool pa_once_begin(pa_once *o);
> +bool pa_once_doit(pa_once *control);

You would typically not like to expose this function, but it is 
necessary as the beginning of the function was inlined. Should perhaps 
be called "pa_once_begin_internal" and have a comment saying that one 
should call pa_once_begin instead of this function.

> +
> +static inline bool pa_once_begin(pa_once *control) {
> +    pa_assert(control);
> +
> +    if (pa_atomic_load(&control->done))
> +        return false;
> +
> +    return pa_once_doit(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
>

-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list