2004-03-01  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
	(__pthread_cond_timedwait): Optimize wakeup test.
	* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
	(__pthread_cond_wait): Likewise.
	* sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Likewise.
	* sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait):
	Likewise.
This commit is contained in:
Ulrich Drepper 2004-03-01 08:47:37 +00:00
parent b7fe377cba
commit cff08c8110
6 changed files with 22 additions and 16 deletions

View File

@ -1,3 +1,13 @@
2004-03-01 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
(__pthread_cond_timedwait): Optimize wakeup test.
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
(__pthread_cond_wait): Likewise.
* sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Likewise.
* sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait):
Likewise.
2004-02-29 Ulrich Drepper <drepper@redhat.com> 2004-02-29 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S

View File

@ -65,7 +65,7 @@ cond_timedwait(cv, mutex, timeout):
val = cv->wakeup_seq; val = cv->wakeup_seq;
if (val > seq && cv->woken_seq < val) { if (val != seq && cv->woken_seq != val) {
ret = 0; ret = 0;
break; break;
} }

View File

@ -159,7 +159,7 @@ __pthread_cond_timedwait (cond, mutex, abstime)
/* Check whether we are eligible for wakeup. */ /* Check whether we are eligible for wakeup. */
val = cond->__data.__wakeup_seq; val = cond->__data.__wakeup_seq;
if (val > seq && cond->__data.__woken_seq < val) if (val != seq && cond->__data.__woken_seq != val)
break; break;
/* Not woken yet. Maybe the time expired? */ /* Not woken yet. Maybe the time expired? */

View File

@ -143,7 +143,7 @@ __pthread_cond_wait (cond, mutex)
/* Check whether we are eligible for wakeup. */ /* Check whether we are eligible for wakeup. */
val = cond->__data.__wakeup_seq; val = cond->__data.__wakeup_seq;
} }
while (! (val > seq && cond->__data.__woken_seq < val)); while (val == seq || cond->__data.__woken_seq == val);
/* Another thread woken up. */ /* Another thread woken up. */
++cond->__data.__woken_seq; ++cond->__data.__woken_seq;

View File

@ -190,16 +190,14 @@ __pthread_cond_timedwait:
movl wakeup_seq+4(%ebx), %edx movl wakeup_seq+4(%ebx), %edx
cmpl 16(%esp), %edx cmpl 16(%esp), %edx
ja 7f jne 7f
jb 15f
cmpl 12(%esp), %edi cmpl 12(%esp), %edi
jbe 15f je 15f
7: cmpl %ecx, %edx 7: cmpl %ecx, %edx
ja 9f jne 9f
jb 15f
cmp %eax, %edi cmp %eax, %edi
ja 9f jne 9f
15: cmpl $-ETIMEDOUT, %esi 15: cmpl $-ETIMEDOUT, %esi
jne 8b jne 8b

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. /* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -133,16 +133,14 @@ __pthread_cond_wait:
movl wakeup_seq+4(%ebx), %edx movl wakeup_seq+4(%ebx), %edx
cmpl 8(%esp), %edx cmpl 8(%esp), %edx
ja 7f jne 7f
jb 8b
cmpl 4(%esp), %edi cmpl 4(%esp), %edi
jbe 8b je 8b
7: cmpl %ecx, %edx 7: cmpl %ecx, %edx
ja 9f jne 9f
jb 8b
cmp %eax, %edi cmp %eax, %edi
jna 8b je 8b
9: addl $1, woken_seq(%ebx) 9: addl $1, woken_seq(%ebx)
adcl $0, woken_seq+4(%ebx) adcl $0, woken_seq+4(%ebx)