2016-06-28 04:20:47 -04:00
|
|
|
/*
|
|
|
|
* APPLE Compatibility
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef __APPLE__
|
|
|
|
|
|
|
|
#include <pthread.h>
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
#include "apple_compat.h"
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-11 05:14:59 -04:00
|
|
|
#endif // __APPLE_
|