From 60164570111873175111cf8a5b973375e492eee9 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Tue, 27 Sep 2011 13:50:29 -0400 Subject: process-shared barrier support, based on discussion with bdonlan this implementation is rather heavy-weight, but it's the first solution i've found that's actually correct. all waiters actually wait twice at the barrier so that they can synchronize exit, and they hold a "vm lock" that prevents changes to virtual memory mappings (and blocks pthread_barrier_destroy) until all waiters are finished inspecting the barrier. thus, it is safe for any thread to destroy and/or unmap the barrier's memory as soon as pthread_barrier_wait returns, without further synchronization. --- src/thread/pthread_barrier_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/thread/pthread_barrier_init.c') diff --git a/src/thread/pthread_barrier_init.c b/src/thread/pthread_barrier_init.c index 736d1014..ccaab4eb 100644 --- a/src/thread/pthread_barrier_init.c +++ b/src/thread/pthread_barrier_init.c @@ -2,7 +2,7 @@ int pthread_barrier_init(pthread_barrier_t *b, const pthread_barrierattr_t *a, unsigned count) { - if (!count) return EINVAL; - *b = (pthread_barrier_t){ ._b_limit = count-1 }; + if (count-1 > INT_MAX-1) return EINVAL; + *b = (pthread_barrier_t){ ._b_limit = count-1 | (a?*a:0) }; return 0; } -- cgit v1.2.1