October 3, 2008 RUN_ONCE 9

### NAME

RUN_ONCE - Run a function exactly once

### SYNOPSIS

```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)