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_destroy.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/thread/pthread_barrier_destroy.c') diff --git a/src/thread/pthread_barrier_destroy.c b/src/thread/pthread_barrier_destroy.c index 2898c41a..f82664d5 100644 --- a/src/thread/pthread_barrier_destroy.c +++ b/src/thread/pthread_barrier_destroy.c @@ -1,6 +1,12 @@ #include "pthread_impl.h" +void __vm_lock(int), __vm_unlock(void); + int pthread_barrier_destroy(pthread_barrier_t *b) { + if (b->_b_limit < 0) { + __vm_lock(-1); + __vm_unlock(); + } return 0; } -- cgit v1.2.1