summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-02-27 23:45:12 +0000
committerUlrich Drepper <drepper@redhat.com>2003-02-27 23:45:12 +0000
commit567fb22ae371d2d9730cbee4a716d3a091276b55 (patch)
tree5fdacdbecbcdccbab89b8a0349f80243562dfc66 /nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S
parent427f5fa1a451050d0900ef689ce81d77b3f40d2e (diff)
Update.
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Release lock before waking up the waiters.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S21
1 files changed, 18 insertions, 3 deletions
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)