Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 27 Feb 2003 23:45:12 +0000 (23:45 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 27 Feb 2003 23:45:12 +0000 (23:45 +0000)
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S:
Release lock before waking up the waiters.

nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
nptl/tst-exit1.c

index d549c7f..ea6e5e0 100644 (file)
@@ -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.
index fffef03..34bf95a 100644 (file)
@@ -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)
index 0081f32..44175f7 100644 (file)
@@ -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);