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.
70 lines
1.4 KiB
70 lines
1.4 KiB
8 years ago
|
/**
|
||
|
* 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_
|