os: Implement pipe_barrier for POSIX platforms without pthread_barrier_t.

This patch was tested on Mac OS X.
This commit is contained in:
Vinson Lee 2010-04-17 14:24:23 -07:00
parent 44bafca1a0
commit 35aae6839e

View file

@ -299,22 +299,43 @@ static INLINE void pipe_barrier_wait(pipe_barrier *barrier)
#else
typedef unsigned pipe_barrier;
typedef struct {
unsigned count;
unsigned waiters;
pipe_mutex mutex;
pipe_condvar condvar;
} pipe_barrier;
static INLINE void pipe_barrier_init(pipe_barrier *barrier, unsigned count)
{
/* XXX we could implement barriers with a mutex and condition var */
assert(0);
barrier->count = count;
barrier->waiters = 0;
pipe_mutex_init(barrier->mutex);
pipe_condvar_init(barrier->condvar);
}
static INLINE void pipe_barrier_destroy(pipe_barrier *barrier)
{
assert(0);
assert(barrier->waiters == 0);
pipe_mutex_destroy(barrier->mutex);
pipe_condvar_destroy(barrier->condvar);
}
static INLINE void pipe_barrier_wait(pipe_barrier *barrier)
{
assert(0);
pipe_mutex_lock(barrier->mutex);
assert(barrier->waiters < barrier->count);
barrier->waiters++;
if (barrier->waiters < barrier->count) {
pipe_condvar_wait(barrier->condvar, barrier->mutex);
} else {
barrier->waiters = 0;
pipe_condvar_broadcast(barrier->condvar);
}
pipe_mutex_unlock(barrier->mutex);
}