about summary refs log tree commit diff
path: root/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S35
1 files changed, 22 insertions, 13 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
index 5bcaec09c0..a433ba3c37 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -79,11 +79,16 @@ __pthread_cond_broadcast:
 #endif
 	tst	r2, r2
 	bf	7f
+
 8:
-	/* Wake up all threads.  */
+	/* Don't use requeue for pshared condvars.  */
+	mov	#-1, r0
+	cmp/eq	r0, r9
 	mov	r8, r4
-	add	#wakeup_seq, r4
-#ifdef __ASSUME_FUTEX_REQUEUE
+	bt/s	9f
+	 add	#wakeup_seq, r4
+
+	/* Wake up all threads.  */
 	mov	#FUTEX_REQUEUE, r5
 	mov	#1, r6
 	mov	#-1, r7
@@ -95,17 +100,9 @@ __pthread_cond_broadcast:
 	mov	#SYS_futex, r3
 	extu.b	r3, r3
 	trapa	#0x15
-#else
-	mov	#FUTEX_WAKE, r5
-	mov	#-1, r6
-	shlr	r6		/* r6 = 0x7fffffff */
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-#endif
 	SYSCALL_INST_PAD
 
+10:
 	mov	#0, r0
 	lds.l	@r15+, pr
 	mov.l	@r15+, r8
@@ -167,6 +164,18 @@ __pthread_cond_broadcast:
 	bra	8b
 	 nop
 
+9:
+	mov	#FUTEX_WAKE, r5
+	mov	#-1, r6
+	shlr	r6		/* r6 = 0x7fffffff */
+	mov	#0, r7
+	mov	#SYS_futex, r3
+	extu.b	r3, r3
+	trapa	#0x14
+	SYSCALL_INST_PAD
+	bra	10b
+	 nop
+
 	.align	2
 .Lmwait5:
 	.long	__lll_mutex_lock_wait-.Lmwait5b