From 567fb22ae371d2d9730cbee4a716d3a091276b55 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 27 Feb 2003 23:45:12 +0000 Subject: Update. * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Release lock before waking up the waiters. --- nptl/ChangeLog | 3 +++ .../sysv/linux/i386/i486/pthread_cond_broadcast.S | 21 ++++++++++++++++++--- nptl/tst-exit1.c | 4 +--- 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 + * 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 #include -#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); -- cgit 1.4.1