* 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.
This commit is contained in:
Ulrich Drepper 2003-03-18 18:56:16 +00:00
parent d5cb838958
commit 24a49f38ad
6 changed files with 158 additions and 371 deletions

482
configure vendored

File diff suppressed because it is too large Load diff

View file

@ -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.

View file

@ -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))

View file

@ -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)

View file

@ -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;

View file

@ -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