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:
@@ -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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user