From: Vinson Lee Date: Sat, 17 Apr 2010 21:24:23 +0000 (-0700) Subject: os: Implement pipe_barrier for POSIX platforms without pthread_barrier_t. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=35aae6839e7bf29e602f6bf9e8730cc62d83f8cd;p=mesa.git os: Implement pipe_barrier for POSIX platforms without pthread_barrier_t. This patch was tested on Mac OS X. --- diff --git a/src/gallium/auxiliary/os/os_thread.h b/src/gallium/auxiliary/os/os_thread.h index 004dad6b63c..07a4268fc0a 100644 --- a/src/gallium/auxiliary/os/os_thread.h +++ b/src/gallium/auxiliary/os/os_thread.h @@ -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); }