diff options
author | Dinakar Guniguntala <dino@in.ibm.com> | 2009-12-13 11:50:16 -0800 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-12-13 11:50:16 -0800 |
commit | 75956694f3f80a1c32389c95069641f52c236c8b (patch) | |
tree | ea36af18886f09a9b3705859c3761b07d66a63e5 /nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S | |
parent | 51ddd2c01e0636f713417f30379b876e85558f61 (diff) | |
download | glibc-75956694f3f80a1c32389c95069641f52c236c8b.tar.gz glibc-75956694f3f80a1c32389c95069641f52c236c8b.tar.xz glibc-75956694f3f80a1c32389c95069641f52c236c8b.zip |
Add Requeue-PI support for x86 arch.
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.S | 30 |
1 files changed, 26 insertions, 4 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 40fb04b31b..a7ca78f78d 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 @@ -91,12 +91,17 @@ __pthread_cond_broadcast: 8: cmpl $-1, %edi je 9f - /* XXX: The kernel so far doesn't support requeue to PI futex. */ - /* XXX: The kernel only supports FUTEX_CMP_REQUEUE to the same - type of futex (private resp. shared). */ - testl $(PI_BIT | PS_BIT), MUTEX_KIND(%edi) + /* Do not use requeue for pshared condvars. */ + testl $PS_BIT, MUTEX_KIND(%edi) jne 9f + /* Requeue to a non-robust PI mutex if the PI bit is set and + the robust bit is not set. */ + movl MUTEX_KIND(%edi), %eax + andl $(ROBUST_BIT|PI_BIT), %eax + cmpl $PI_BIT, %eax + je 81f + /* Wake up all threads. */ #ifdef __ASSUME_PRIVATE_FUTEX movl $(FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG), %ecx @@ -138,6 +143,23 @@ __pthread_cond_broadcast: cfi_restore_state +81: movl $(FUTEX_CMP_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %ecx + movl $SYS_futex, %eax + movl $0x7fffffff, %esi + movl $1, %edx + /* Get the address of the futex involved. */ +# if MUTEX_FUTEX != 0 + addl $MUTEX_FUTEX, %edi +# endif + int $0x80 + + /* For any kind of error, which mainly is EAGAIN, we try again + with WAKE. The general test also covers running on old + kernels. */ + cmpl $0xfffff001, %eax + jb 6b + jmp 9f + /* Initial locking failed. */ 1: #if cond_lock == 0 |