int
RUN_ONCE(
once_t *control
, int (*init_func)(void)
)
)
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.
)
returns what
init_func(
)
returned.
Otherwise, it returns 0.
)
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.
*/
}