1 #include <pthread.h>
2 
3 #if defined(__APPLE__) || !defined(_POSIX_BARRIERS)
4 
5 #undef pthread_barrier_t
6 
7 typedef struct {
8   int needed;
9   int called;
10   pthread_mutex_t mutex;
11   pthread_cond_t cond;
12 } pthread_barrier_t;
13 
14 #if defined(__cplusplus)
15 extern "C" {
16 #endif
17 
18   int pthread_barrier_init(pthread_barrier_t *barrier, void * attr, int needed);
19   int pthread_barrier_destroy(pthread_barrier_t *barrier);
20   int pthread_barrier_wait(pthread_barrier_t *barrier);
21 
pthread_barrier_init(pthread_barrier_t * barrier,void * attr,int needed)22   int pthread_barrier_init(pthread_barrier_t *barrier, void * attr, int needed)
23   {
24     barrier->needed = needed;
25     barrier->called = 0;
26     pthread_mutex_init(&barrier->mutex,NULL);
27     pthread_cond_init(&barrier->cond,NULL);
28     return 0;
29   }
30 
pthread_barrier_destroy(pthread_barrier_t * barrier)31   int pthread_barrier_destroy(pthread_barrier_t *barrier)
32   {
33     pthread_mutex_destroy(&barrier->mutex);
34     pthread_cond_destroy(&barrier->cond);
35     return 0;
36   }
37 
pthread_barrier_wait(pthread_barrier_t * barrier)38   int pthread_barrier_wait(pthread_barrier_t *barrier)
39   {
40     pthread_mutex_lock(&barrier->mutex);
41     barrier->called++;
42     if (barrier->called == barrier->needed) {
43       barrier->called = 0;
44       pthread_cond_broadcast(&barrier->cond);
45     } else {
46       pthread_cond_wait(&barrier->cond,&barrier->mutex);
47     }
48     pthread_mutex_unlock(&barrier->mutex);
49     return 0;
50   }
51 
52 #if defined(__cplusplus)
53 }
54 #endif
55 
56 #endif
57