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.
This commit is contained in:
Rich Felker
2011-09-27 13:50:29 -04:00
parent 3f39c9b313
commit 6016457011
7 changed files with 102 additions and 16 deletions
+5 -3
View File
@@ -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"