Tanguy Pruvot
8 years ago
9 changed files with 141 additions and 5 deletions
@ -0,0 +1,69 @@ |
|||||||
|
/**
|
||||||
|
* Meant to improve clang 4 / macos compatibility (untested) |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef PTHREAD_BARRIER_H_ |
||||||
|
#define PTHREAD_BARRIER_H_ |
||||||
|
|
||||||
|
#include <pthread.h> |
||||||
|
#include <errno.h> |
||||||
|
|
||||||
|
typedef int pthread_barrierattr_t; |
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
pthread_mutex_t mutex; |
||||||
|
pthread_cond_t cond; |
||||||
|
int count; |
||||||
|
int tripCount; |
||||||
|
} pthread_barrier_t; |
||||||
|
|
||||||
|
|
||||||
|
int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) |
||||||
|
{ |
||||||
|
if(count == 0) |
||||||
|
{ |
||||||
|
errno = EINVAL; |
||||||
|
return -1; |
||||||
|
} |
||||||
|
if(pthread_mutex_init(&barrier->mutex, 0) < 0) |
||||||
|
{ |
||||||
|
return -1; |
||||||
|
} |
||||||
|
if(pthread_cond_init(&barrier->cond, 0) < 0) |
||||||
|
{ |
||||||
|
pthread_mutex_destroy(&barrier->mutex); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
barrier->tripCount = count; |
||||||
|
barrier->count = 0; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int pthread_barrier_destroy(pthread_barrier_t *barrier) |
||||||
|
{ |
||||||
|
pthread_cond_destroy(&barrier->cond); |
||||||
|
pthread_mutex_destroy(&barrier->mutex); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int pthread_barrier_wait(pthread_barrier_t *barrier) |
||||||
|
{ |
||||||
|
pthread_mutex_lock(&barrier->mutex); |
||||||
|
++(barrier->count); |
||||||
|
if(barrier->count >= barrier->tripCount) |
||||||
|
{ |
||||||
|
barrier->count = 0; |
||||||
|
pthread_cond_broadcast(&barrier->cond); |
||||||
|
pthread_mutex_unlock(&barrier->mutex); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
pthread_cond_wait(&barrier->cond, &(barrier->mutex)); |
||||||
|
pthread_mutex_unlock(&barrier->mutex); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endif // PTHREAD_BARRIER_H_
|
Loading…
Reference in new issue