about summary refs log tree commit diff
path: root/nptl/sysdeps/pthread/pthread_cond_wait.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-03-11 22:02:29 +0000
committerUlrich Drepper <drepper@redhat.com>2003-03-11 22:02:29 +0000
commit3e976b962a84255b70bcf6d9751a9a35d3e987ab (patch)
treefb907a8a5795c4a098f4a6798bacece4822f615e /nptl/sysdeps/pthread/pthread_cond_wait.c
parent6c477888caa491a3a296f5a8ef594cc4aa37b555 (diff)
downloadglibc-3e976b962a84255b70bcf6d9751a9a35d3e987ab.tar.gz
glibc-3e976b962a84255b70bcf6d9751a9a35d3e987ab.tar.xz
glibc-3e976b962a84255b70bcf6d9751a9a35d3e987ab.zip
Update.
2003-03-11  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
	(__condvar_cleanup): Wake up all waiters in case we got signaled
	after being woken up but before disabling asynchronous
	cancellation.
	* sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Likewise.
	* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
	(__condvar_cleanup): Likewise.

	* init.c (__NR_set_tid_address): If already defined, don't redefine.
	Make it an error if architecture has no #if case.  Add x86-64.

	* sysdeps/unix/sysv/linux/x86_64/Makefile: Add flags for
	pt-initfini.s generation.

	* sysdeps/x86_64/tls.h: Include <asm/prctl.h>.
	(TLS_INIT_TP): Fix typo.
Diffstat (limited to 'nptl/sysdeps/pthread/pthread_cond_wait.c')
-rw-r--r--nptl/sysdeps/pthread/pthread_cond_wait.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/nptl/sysdeps/pthread/pthread_cond_wait.c b/nptl/sysdeps/pthread/pthread_cond_wait.c
index 399cee89ee..78fcc7f6c6 100644
--- a/nptl/sysdeps/pthread/pthread_cond_wait.c
+++ b/nptl/sysdeps/pthread/pthread_cond_wait.c
@@ -34,6 +34,7 @@ struct _condvar_cleanup_buffer
   pthread_mutex_t *mutex;
 };
 
+
 void
 __attribute__ ((visibility ("hidden")))
 __condvar_cleanup (void *arg)
@@ -49,6 +50,16 @@ __condvar_cleanup (void *arg)
   ++cbuffer->cond->__data.__wakeup_seq;
   ++cbuffer->cond->__data.__woken_seq;
 
+  /* Wake everybody to make sure no condvar signal gets lost.  */
+#if BYTE_ORDER == LITTLE_ENDIAN
+  int *futex = ((int *) (&cbuffer->cond->__data.__wakeup_seq));
+#elif BYTE_ORDER == BIG_ENDIAN
+  int *futex = ((int *) (&cbuffer->cond->__data.__wakeup_seq)) + 1;
+#else
+# error "No valid byte order"
+#endif
+  lll_futex_wake (futex, INT_MAX);
+
   /* We are done.  */
   lll_mutex_unlock (cbuffer->cond->__data.__lock);