about summary refs log tree commit diff
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
parentda0ff4ae5ba18db9c82522ea0fce26b327ea10ee (diff)
downloadglibc-191ec77f9b5c2c34dfd7980c097b5a8cd701ec25.tar.gz
glibc-191ec77f9b5c2c34dfd7980c097b5a8cd701ec25.tar.xz
glibc-191ec77f9b5c2c34dfd7980c097b5a8cd701ec25.zip
* sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait):
	Store 2 before returning ETIMEDOUT.
-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: