Mesa (master): os: Implement pipe_barrier for POSIX platforms without pthread_barrier_t.
Vinson Lee
vlee at kemper.freedesktop.org
Sat Apr 17 21:34:05 UTC 2010
Module: Mesa
Branch: master
Commit: 35aae6839e7bf29e602f6bf9e8730cc62d83f8cd
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=35aae6839e7bf29e602f6bf9e8730cc62d83f8cd
Author: Vinson Lee <vlee at vmware.com>
Date: Sat Apr 17 14:24:23 2010 -0700
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 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/src/gallium/auxiliary/os/os_thread.h b/src/gallium/auxiliary/os/os_thread.h
index 004dad6..07a4268 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);
}
More information about the mesa-commit
mailing list