diff options
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S index 28c24bad65..89ad6a3774 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S @@ -46,12 +46,13 @@ __pthread_rwlock_wrlock: movl 12(%esp), %ebx /* Get the lock. */ - movl $1, %eax + movl $1, %edx + xorl %eax, %eax LOCK #if MUTEX == 0 - xaddl %eax, (%ebx) + cmpxchgl %edx, (%ebx) #else - xaddl %eax, MUTEX(%ebx) + cmpxchgl %edx, MUTEX(%ebx) #endif testl %eax, %eax jne 1f @@ -83,12 +84,13 @@ __pthread_rwlock_wrlock: subl $WRITERS_WAKEUP, %ebx /* Reget the lock. */ - movl $1, %eax + movl $1, %edx + xorl %eax, %eax LOCK #if MUTEX == 0 - xaddl %eax, (%ebx) + cmpxchgl %edx, (%ebx) #else - xaddl %eax, MUTEX(%ebx) + cmpxchgl %edx, MUTEX(%ebx) #endif testl %eax, %eax jne 12f |