about summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog8
-rw-r--r--nptl/sysdeps/pthread/pthread_cond_wait.c6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S14
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S17
5 files changed, 27 insertions, 20 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 20ae05d91b..f80683f6ce 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,5 +1,13 @@
 2003-03-18  Ulrich Drepper  <drepper@redhat.com>
 
+	* sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
+	(pthrad_cond_t): Replace __unused field with __clock.
+
+	* sysdeps/pthread/pthread_cond_wait.c: Release condvar lock before
+	waken all waiters in cleanup handler.
+	* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise.
+	* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise.
+
 	* pthread_condattr_getclock.c: New file.
 	* pthread_condattr_setclock.c: New file.
 	* sysdeps/pthread/pthread.h: Declare these new functions.
diff --git a/nptl/sysdeps/pthread/pthread_cond_wait.c b/nptl/sysdeps/pthread/pthread_cond_wait.c
index 412bca9c25..708566be03 100644
--- a/nptl/sysdeps/pthread/pthread_cond_wait.c
+++ b/nptl/sysdeps/pthread/pthread_cond_wait.c
@@ -50,6 +50,9 @@ __condvar_cleanup (void *arg)
   ++cbuffer->cond->__data.__wakeup_seq;
   ++cbuffer->cond->__data.__woken_seq;
 
+  /* We are done.  */
+  lll_mutex_unlock (cbuffer->cond->__data.__lock);
+
   /* Wake everybody to make sure no condvar signal gets lost.  */
 #if BYTE_ORDER == LITTLE_ENDIAN
   int *futex = ((int *) (&cbuffer->cond->__data.__wakeup_seq));
@@ -60,9 +63,6 @@ __condvar_cleanup (void *arg)
 #endif
   lll_futex_wake (futex, INT_MAX);
 
-  /* We are done.  */
-  lll_mutex_unlock (cbuffer->cond->__data.__lock);
-
   /* Get the mutex before returning unless asynchronous cancellation
      is in effect.  */
   if (!(cbuffer->oldtype & CANCELTYPE_BITMASK))
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
index 68ce35e8d6..c7a4881ed2 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
@@ -70,12 +70,6 @@ __condvar_cleanup:
 	addl	$1, woken_seq-wakeup_seq(%ebx)
 	adcl	$0, woken_seq-wakeup_seq+4(%ebx)
 
-	/* Wake up all waiters to make sure no signal gets lost.  */
-	movl	$FUTEX_WAKE, %ecx
-	movl	$SYS_futex, %eax
-	movl	$0x7fffffff, %edx
-	ENTER_KERNEL
-
 	LOCK
 	subl	$1, cond_lock-wakeup_seq(%ebx)
 	je	2f
@@ -83,8 +77,14 @@ __condvar_cleanup:
 	leal	cond_lock-wakeup_seq(%ebx), %eax
 	call	__lll_mutex_unlock_wake
 
+	/* Wake up all waiters to make sure no signal gets lost.  */
+2:	movl	$FUTEX_WAKE, %ecx
+	movl	$SYS_futex, %eax
+	movl	$0x7fffffff, %edx
+	ENTER_KERNEL
+
 	/* Lock the mutex unless asynchronous cancellation is in effect.  */
-2:	testl	$2, (%esi)
+	testl	$2, (%esi)
 	jne	3f
 
 	pushl	8(%esi)
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h b/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
index 67ef324831..3b717a2ead 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
@@ -74,7 +74,7 @@ typedef union
   struct
   {
     int __lock;
-    int __unused;
+    int __clock;
     unsigned long long int __total_seq;
     unsigned long long int __wakeup_seq;
     unsigned long long int __woken_seq;
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
index 835486a8a1..652ddca772 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
@@ -65,14 +65,6 @@ __condvar_cleanup:
 
 	incq	woken_seq(%rdi)
 
-	/* Wake up all waiters to make sure no signal gets lost.  */
-	addq	$wakeup_seq, %rdi
-	movq	$FUTEX_WAKE, %rsi
-	movl	$0x7fffffff, %edx
-	movq	$SYS_futex, %rax
-	syscall
-	subq	$wakeup_seq, %rdi
-
 	LOCK
 #if cond_lock == 0
 	decl	(%rdi)
@@ -85,8 +77,15 @@ __condvar_cleanup:
 #endif
 	callq	__lll_mutex_unlock_wake
 
+	/* Wake up all waiters to make sure no signal gets lost.  */
+2:	addq	$wakeup_seq, %rdi
+	movq	$FUTEX_WAKE, %rsi
+	movl	$0x7fffffff, %edx
+	movq	$SYS_futex, %rax
+	syscall
+
 	/* Lock the mutex unless asynchronous cancellation is in effect.  */
-2:	testq	$2, (%r8)
+	testq	$2, (%r8)
 	jne	3f
 
 	movq	16(%r8), %rdi