aboutsummaryrefslogtreecommitdiff
path: root/nptl
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-03-18 18:56:16 +0000
committerUlrich Drepper <drepper@redhat.com>2003-03-18 18:56:16 +0000
commit24a49f38ad4f05aca5d4b55b2bc1ac31347342ce (patch)
tree4ea12aecc7307ff8f68b04002196da07928b0300 /nptl
parentd5cb838958b610de0bef12722860030eec964aaf (diff)
downloadglibc-24a49f38ad4f05aca5d4b55b2bc1ac31347342ce.tar
glibc-24a49f38ad4f05aca5d4b55b2bc1ac31347342ce.tar.gz
glibc-24a49f38ad4f05aca5d4b55b2bc1ac31347342ce.tar.bz2
glibc-24a49f38ad4f05aca5d4b55b2bc1ac31347342ce.zip
Update.
* 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.
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