diff options
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/ChangeLog | 8 | ||||
-rw-r--r-- | nptl/sysdeps/pthread/pthread_cond_wait.c | 6 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S | 14 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h | 2 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S | 17 |
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 |