summaryrefslogtreecommitdiff
path: root/nptl
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-12-05 02:31:48 +0000
committerUlrich Drepper <drepper@redhat.com>2007-12-05 02:31:48 +0000
commit191ec77f9b5c2c34dfd7980c097b5a8cd701ec25 (patch)
treec014825212771e3371233db4b76f48fd92ebfc7f /nptl
parentda0ff4ae5ba18db9c82522ea0fce26b327ea10ee (diff)
* sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait):
Store 2 before returning ETIMEDOUT.
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S46
2 files changed, 23 insertions, 28 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index ddecc8bef5..05d95eb3b4 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-04 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait):
+ Store 2 before returning ETIMEDOUT.
+
2007-11-23 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/x86_64/lowlevellock.S (__lll_timedlock_wait):
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
index 769cac3ccd..afcf0be299 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
@@ -225,6 +225,12 @@ __lll_timedlock_wait:
add #-8, r15
cfi_adjust_cfa_offset(8)
+ mov #2, r2
+ XCHG (r2, @r8, r3)
+
+ tst r3, r3
+ bt 6f
+
1:
/* Get current time. */
mov r15, r4
@@ -250,17 +256,11 @@ __lll_timedlock_wait:
add #-1, r2
4:
cmp/pz r2
- bf 5f /* Time is already up. */
+ bf 2f /* Time is already up. */
mov.l r2, @r15 /* Store relative timeout. */
mov.l r3, @(4,r15)
- mov #1, r3
- mov #2, r4
- CMPXCHG (r3, @r8, r4, r2)
- tst r2, r2
- bt 8f
-
mov r8, r4
mov r11, r5
LOAD_FUTEX_WAIT (r5, r0, r1)
@@ -272,39 +272,29 @@ __lll_timedlock_wait:
SYSCALL_INST_PAD
mov r0, r5
-8:
- mov #0, r3
- mov #2, r4
- CMPXCHG (r3, @r8, r4, r2)
- bf/s 7f
- mov #0, r0
+ mov #2, r2
+ XCHG (r2, @r8, r3)
+
+ tst r3, r3
+ bt/s 6f
+ mov #-ETIMEDOUT, r1
+ cmp/eq r5, r1
+ bf 1b
+
+2: mov #ETIMEDOUT, r3
6:
+ mov r3, r0
add #8, r15
mov.l @r15+, r8
mov.l @r15+, r9
mov.l @r15+, r10
rts
mov.l @r15+, r11
-7:
- /* Check whether the time expired. */
- mov #-ETIMEDOUT, r1
- cmp/eq r5, r1
- bt 5f
- /* Make sure the current holder knows we are going to sleep. */
- XCHG (r2, @r8, r3)
- tst r3, r3
- bt/s 6b
- mov #0, r0
- bra 1b
- nop
3:
rts
mov #EINVAL, r0
-5:
- bra 6b
- mov #ETIMEDOUT, r0
cfi_endproc
.L1k: