You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.4 KiB
69 lines
1.4 KiB
/** |
|
* 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_
|
|
|