about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-09-28 12:47:15 -0400
committerRich Felker <dalias@aerifal.cx>2011-09-28 12:47:15 -0400
commit8f4a115e7d38c31ad8d8c7233eaff2db270aebd8 (patch)
treec7364fb7d2b27d0523302aff0527e6da4b8195e6
parentf0a8d60d32b7d6a093596abdbb9711e64eff2594 (diff)
downloadmusl-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...
-rw-r--r--src/thread/pthread_barrier_destroy.c2
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();
 	}