19#ifndef HAVE_PTHREAD_BARRIER_WAIT
21#define pthread_barrier_t barrier_t
22#define pthread_barrier_attr_t barrier_attr_t
23#define pthread_barrier_init(b,a,n) barrier_init(b,n)
24#define pthread_barrier_destroy(b) barrier_destroy(b)
25#define pthread_barrier_wait(b) barrier_wait(b)
27#define PTHREAD_BARRIER_SERIAL_THREAD 1
29#define BARRIER_ARRIVE(B,RV) \
30 RV = pthread_barrier_wait(B); \
31 if(RV !=0 && RV != PTHREAD_BARRIER_SERIAL_THREAD){ \
32 printf("Couldn't wait on barrier\n"); \
39 pthread_mutex_t mutex;
43static int barrier_init(
barrier_t *barrier,
int needed);
44static int barrier_destroy(
barrier_t *barrier);
45static int barrier_wait(
barrier_t *barrier);
48barrier_init(
barrier_t *barrier,
int needed)
50 barrier->needed = needed;
52 pthread_mutex_init(&barrier->mutex,NULL);
53 pthread_cond_init(&barrier->cond,NULL);
61 pthread_mutex_destroy(&barrier->mutex);
62 pthread_cond_destroy(&barrier->cond);
70 pthread_mutex_lock(&barrier->mutex);
73 if (barrier->called == barrier->needed) {
75 pthread_cond_broadcast(&barrier->cond);
77 pthread_cond_wait(&barrier->cond,&barrier->mutex);
80 pthread_mutex_unlock(&barrier->mutex);