NAME
RUN_ONCE —
Run a function exactly
once
SYNOPSIS
#include <sys/once.h>
ONCE_DECL(control);
int
RUN_ONCE(
once_t
*control,
int
(*init_func)(void));
DESCRIPTION
RUN_ONCE() provides a functionality similar to
pthread_once(3). It
ensures that, for a given
control,
init_func() is executed (successfully) exactly once. It is
considered as a successful execution if and only if
init_func() returned 0. As long as there was no successful
execution,
RUN_ONCE() will try again each time it is called.
RUN_ONCE() can sleep if it's called concurrently.
RETURN VALUES
On failure,
RUN_ONCE() returns what
init_func() returned. Otherwise, it returns 0.
EXAMPLES
The following example shows how
RUN_ONCE() is used. Regardless
of how many times
some_func() is executed,
init_func() will be executed exactly once.
static int
init_func(void)
{
/*
* do some initialization.
*/
return 0; /* success */
}
int
some_func(void)
{
static ONCE_DECL(control);
RUN_ONCE(&control, init_func);
/*
* we are sure that init_func has already been completed here.
*/
}
SEE ALSO
pthread_once(3),
condvar(9),
intro(9)