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/internal/pthread_impl.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/internal/pthread_impl.h') diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index bbb4502f..82d62426 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -73,10 +73,12 @@ struct __timer { #define _c_waiters2 __u.__i[7] #define _rw_lock __u.__i[0] #define _rw_waiters __u.__i[1] -#define _b_inst __u.__p[0] +#define _b_lock __u.__i[0] +#define _b_waiters __u.__i[1] #define _b_limit __u.__i[2] -#define _b_lock __u.__i[3] -#define _b_waiters __u.__i[4] +#define _b_count __u.__i[3] +#define _b_seq __u.__i[4] +#define _b_inst __u.__p[4] #include "pthread_arch.h" -- cgit v1.2.1