aboutsummaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/i386
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S26
1 files changed, 25 insertions, 1 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 bb5f8d1bc8..7dd97ba49e 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
@@ -76,10 +76,25 @@ __pthread_rwlock_unlock:
leal READERS_WAKEUP(%edi), %ebx
0: incl (%ebx)
- xorl %esi, %esi
+ LOCK
+#if MUTEX == 0
+ decl (%edi)
+#else
+ decl MUTEX(%edi)
+#endif
+ jne 7f
+
+8: xorl %esi, %esi
movl $SYS_futex, %eax
ENTER_KERNEL
+ xorl %eax, %eax
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+
+ .align 16
6: LOCK
#if MUTEX == 0
decl (%edi)
@@ -112,6 +127,15 @@ __pthread_rwlock_unlock:
call __lll_mutex_unlock_wake
jmp 4b
+7:
+#if MUTEX == 0
+ movl %edi, %eax
+#else
+ leal MUTEX(%edx), %eax
+#endif
+ call __lll_mutex_unlock_wake
+ jmp 8b
+
.size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
.globl pthread_rwlock_unlock