RUN_ONCE(9)            NetBSD Kernel Developer's Manual            RUN_ONCE(9)

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)

NetBSD 5.0_STABLE               October 3, 2008              NetBSD 5.0_STABLE
