diff options
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S index 829604662e..bb5f8d1bc8 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S @@ -42,8 +42,6 @@ __pthread_rwlock_unlock: pushl %esi pushl %edi - xorl %esi, %esi - xorl %edx, %edx movl 16(%esp), %edi /* Get the lock. */ @@ -64,20 +62,21 @@ __pthread_rwlock_unlock: 5: movl $0, WRITER(%edi) - movl $0x7fffffff, %edx - leal READERS_WAKEUP(%edi), %ebx movl $1, %ecx - leal WRITERS_WAKEUP(%edi), %eax - cmpl $0, WRITERS_QUEUED(%edi) -#ifdef HAVE_CMOV - cmovnel %ecx, %edx - cmovnel %eax, %ebx -#else - je 0f + leal WRITERS_WAKEUP(%edi), %ebx movl %ecx, %edx - movl %eax, %ebx -0: -#endif + cmpl $0, WRITERS_QUEUED(%edi) + jne 0f + + /* If also no readers waiting nothing to do. */ + cmpl $0, READERS_QUEUED(%edi) + je 6f + + movl $0x7fffffff, %edx + leal READERS_WAKEUP(%edi), %ebx + +0: incl (%ebx) + xorl %esi, %esi movl $SYS_futex, %eax ENTER_KERNEL @@ -95,11 +94,21 @@ __pthread_rwlock_unlock: popl %ebx ret -1: movl %edi, %ecx +1: +#if MUTEX == 0 + movl %edi, %ecx +#else + leal MUTEX(%edx), %ecx +#endif call __lll_mutex_lock_wait jmp 2b -3: movl %edi, %eax +3: +#if MUTEX == 0 + movl %edi, %eax +#else + leal MUTEX(%edx), %eax +#endif call __lll_mutex_unlock_wake jmp 4b |