about summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog3
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S21
-rw-r--r--nptl/tst-exit1.c4
3 files changed, 22 insertions, 6 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index d549c7f162..ea6e5e0a89 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,5 +1,8 @@
 2003-02-27  Ulrich Drepper  <drepper@redhat.com>
 
+	* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S:
+	Release lock before waking up the waiters.
+
 	* tst-exit1.c (do_test): Don't start more than one thread in parallel.
 
 	* tst-rwlock9.c (writer_thread): Correct adding TIMEOUT.
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
index fffef03bd5..34bf95af15 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
@@ -70,13 +70,24 @@ __pthread_cond_broadcast:
 3:	movl	%ecx, (%ebx)
 	movl	%eax, 4(%ebx)
 
+	/* Unlock.  */
+	LOCK
+	decl	cond_lock-wakeup_seq(%ebx)
+	jne	7f
+
 	/* Wake up all threads.  */
-	movl	$FUTEX_WAKE, %ecx
+8:	movl	$FUTEX_WAKE, %ecx
 	xorl	%esi, %esi
 	movl	$SYS_futex, %eax
 	movl	$0x7fffffff, %edx
 	ENTER_KERNEL
 
+	xorl	%eax, %eax
+	popl	%ebx
+	popl	%esi
+	ret
+
+	.align	16
 	/* Unlock.  */
 4:	LOCK
 	decl	cond_lock-wakeup_seq(%ebx)
@@ -98,10 +109,14 @@ __pthread_cond_broadcast:
 	jmp	2b
 
 	/* Unlock in loop requires waekup.  */
-5:
-	leal	cond_lock-wakeup_seq(%ebx), %eax
+5:	leal	cond_lock-wakeup_seq(%ebx), %eax
 	call	__lll_mutex_unlock_wake
 	jmp	6b
+
+	/* Unlock in loop requires waekup.  */
+7:	leal	cond_lock-wakeup_seq(%ebx), %eax
+	call	__lll_mutex_unlock_wake
+	jmp	8b
 	.size	__pthread_cond_broadcast, .-__pthread_cond_broadcast
 versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
 		  GLIBC_2_3_2)
diff --git a/nptl/tst-exit1.c b/nptl/tst-exit1.c
index 0081f32c2e..44175f76c6 100644
--- a/nptl/tst-exit1.c
+++ b/nptl/tst-exit1.c
@@ -24,8 +24,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#define N 20
-
 static pthread_barrier_t b;
 
 
@@ -46,7 +44,7 @@ tf (void *arg)
 static int
 do_test (void)
 {
-  if (pthread_barrier_init (&b, NULL, N + 1) != 0)
+  if (pthread_barrier_init (&b, NULL, 2) != 0)
     {
       puts ("barrier_init failed");
       exit (1);