diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-09-28 12:47:15 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-09-28 12:47:15 -0400 |
commit | 8f4a115e7d38c31ad8d8c7233eaff2db270aebd8 (patch) | |
tree | c7364fb7d2b27d0523302aff0527e6da4b8195e6 /src/thread/pthread_barrier_destroy.c | |
parent | f0a8d60d32b7d6a093596abdbb9711e64eff2594 (diff) | |
download | musl-8f4a115e7d38c31ad8d8c7233eaff2db270aebd8.tar.gz musl-8f4a115e7d38c31ad8d8c7233eaff2db270aebd8.tar.xz musl-8f4a115e7d38c31ad8d8c7233eaff2db270aebd8.zip |
barrier destroy must also wait for threads in other processes exiting barrier
the vm lock only waits for threads in the same process exiting. actually this fix is not enough, but it's a start...
Diffstat (limited to 'src/thread/pthread_barrier_destroy.c')
-rw-r--r-- | src/thread/pthread_barrier_destroy.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/thread/pthread_barrier_destroy.c b/src/thread/pthread_barrier_destroy.c index f82664d5..3ebc2b39 100644 --- a/src/thread/pthread_barrier_destroy.c +++ b/src/thread/pthread_barrier_destroy.c @@ -5,6 +5,8 @@ void __vm_lock(int), __vm_unlock(void); int pthread_barrier_destroy(pthread_barrier_t *b) { if (b->_b_limit < 0) { + int seq = b->_b_seq; + if (seq & 1) __wait(&b->_b_seq, 0, seq, 0); __vm_lock(-1); __vm_unlock(); } |