aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S21
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S10
2 files changed, 19 insertions, 12 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S
index 484beaf..a54e48c 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S
@@ -45,21 +45,23 @@ __lll_mutex_lock_wait:
pushl %ebx
pushl %edx
+ /* In the loop we are going to add 2 instead of 1 which is what
+ the caller did. Account for that. */
+ subl $1, %eax
+
movl %ecx, %ebx
xorl %esi, %esi /* No timeout. */
xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
1:
- leal 1(%eax), %edx /* account for the preceeded xadd. */
+ leal 2(%eax), %edx /* account for the preceeded xadd. */
movl $SYS_futex, %eax
ENTER_KERNEL
- movl $1, %eax
+ movl $2, %eax
LOCK
xaddl %eax, (%ebx)
testl %eax, %eax
- jne 1b
-
- movl $2, (%ebx)
+ jne,pn 1b
popl %edx
popl %ebx
@@ -83,13 +85,17 @@ __lll_mutex_timedlock_wait:
pushl %ebx
pushl %ebp
+ /* In the loop we are going to add 2 instead of 1 which is what
+ the caller did. Account for that. */
+ subl $1, %eax
+
/* Stack frame for the timespec and timeval structs. */
subl $8, %esp
movl %ecx, %ebp
movl %edx, %edi
-1: leal 1(%eax), %esi
+1: leal 2(%eax), %esi
/* Get current time. */
movl %esp, %ebx
@@ -122,13 +128,12 @@ __lll_mutex_timedlock_wait:
ENTER_KERNEL
movl %eax, %ecx
- movl $1, %eax
+ movl $2, %eax
LOCK
xaddl %eax, (%ebx)
testl %eax, %eax
jne 7f
- movl $2, (%ebx)
xorl %eax, %eax
6: addl $8, %esp
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S
index 1b2731a..2a2f847 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S
@@ -46,22 +46,24 @@ __lll_mutex_lock_wait:
pushq %r10
pushq %rdx
+ /* In the loop we are going to add 2 instead of 1 which is what
+ the caller did. Account for that. */
+ decq %rsi
+
xorq %r10, %r10 /* No timeout. */
1:
- leaq 1(%rsi), %rdx /* account for the preceeded xadd. */
+ leaq 2(%rsi), %rdx /* account for the preceeded xadd. */
movq %r10, %rsi /* movq $FUTEX_WAIT, %rsi */
movq $SYS_futex, %rax
syscall
- movl $1, %esi
+ movl $2, %esi
LOCK
xaddl %esi, (%rdi)
testl %esi, %esi
jne 1b
- movl $2, (%rdi)
-
popq %rdx
popq %r10
retq