vq / vlib / builtin / closure / closure_once_nix.h
28 lines · 22 sloc · 653 bytes · 1a2d0e5b70d6dd1baaa60290f2446e9ece4324bf
Raw
1#ifndef V_CLOSURE_ONCE_NIX_H
2#define V_CLOSURE_ONCE_NIX_H
3
4#include <pthread.h>
5
6typedef void (*v_closure_init_fn)(void);
7
8#ifndef V_CLOSURE_STATIC_INLINE
9# ifdef _MSC_VER
10# define V_CLOSURE_STATIC_INLINE static __inline
11# else
12# define V_CLOSURE_STATIC_INLINE static inline
13# endif
14#endif
15
16static pthread_mutex_t v_closure_once_mutex = PTHREAD_MUTEX_INITIALIZER;
17static int v_closure_once_done = 0;
18
19V_CLOSURE_STATIC_INLINE void v_closure_init_once(v_closure_init_fn init_fn) {
20 pthread_mutex_lock(&v_closure_once_mutex);
21 if (!v_closure_once_done) {
22 init_fn();
23 v_closure_once_done = 1;
24 }
25 pthread_mutex_unlock(&v_closure_once_mutex);
26}
27
28#endif
29