diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-02-13 08:32:43 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-02-13 08:32:43 +0000 |
commit | 219304ecbbb8dab55a788dd3bbb31b3ce01d88a9 (patch) | |
tree | 658fa01a840c11bf802e757d8de835bb2f9780a8 /nptl/sysdeps/pthread | |
parent | 3730d95c778f794fff48574c95d6658d6d5224ed (diff) | |
download | glibc-219304ecbbb8dab55a788dd3bbb31b3ce01d88a9.tar glibc-219304ecbbb8dab55a788dd3bbb31b3ce01d88a9.tar.gz glibc-219304ecbbb8dab55a788dd3bbb31b3ce01d88a9.tar.bz2 glibc-219304ecbbb8dab55a788dd3bbb31b3ce01d88a9.zip |
Update.
* sysdeps/pthread/pthread_cond_timedwait.c
(__pthread_cond_timedwait): Optimize. Drop internal lock earlier.
Reuse code. Add __builtin_expects.
* init.c (pthread_functions): Make array const.
Diffstat (limited to 'nptl/sysdeps/pthread')
-rw-r--r-- | nptl/sysdeps/pthread/pthread_cond_timedwait.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/nptl/sysdeps/pthread/pthread_cond_timedwait.c b/nptl/sysdeps/pthread/pthread_cond_timedwait.c index 9fa2920f85..71e9cf7c8d 100644 --- a/nptl/sysdeps/pthread/pthread_cond_timedwait.c +++ b/nptl/sysdeps/pthread/pthread_cond_timedwait.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. @@ -98,6 +98,9 @@ __pthread_cond_timedwait (cond, mutex, abstime) while (1) { + /* Prepare to wait. Release the condvar futex. */ + lll_mutex_unlock (cond->__data.__lock); + struct timespec rt; { #ifdef __NR_clock_gettime @@ -138,19 +141,14 @@ __pthread_cond_timedwait (cond, mutex, abstime) --rt.tv_sec; } /* Did we already time out? */ - if (rt.tv_sec < 0) + if (__builtin_expect (rt.tv_sec < 0, 0)) { - /* Yep. Adjust the sequence counter. */ - ++cond->__data.__wakeup_seq; + /* We are going to look at shared data again, so get the lock. */ + lll_mutex_lock(cond->__data.__lock); - /* The error value. */ - result = ETIMEDOUT; - break; + goto timeout; } - /* Prepare to wait. Release the condvar futex. */ - lll_mutex_unlock (cond->__data.__lock); - /* Enable asynchronous cancellation. Required by the standard. */ cbuffer.oldtype = __pthread_enable_asynccancel (); @@ -170,8 +168,9 @@ __pthread_cond_timedwait (cond, mutex, abstime) break; /* Not woken yet. Maybe the time expired? */ - if (err == -ETIMEDOUT) + if (__builtin_expect (err == -ETIMEDOUT, 0)) { + timeout: /* Yep. Adjust the counters. */ ++cond->__data.__wakeup_seq; |