From 35aae6839e7bf29e602f6bf9e8730cc62d83f8cd Mon Sep 17 00:00:00 2001 From: Vinson Lee Date: Sat, 17 Apr 2010 14:24:23 -0700 Subject: [PATCH] os: Implement pipe_barrier for POSIX platforms without pthread_barrier_t. This patch was tested on Mac OS X. --- src/gallium/auxiliary/os/os_thread.h | 31 +++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) 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); } -- 2.30.2