about summary refs log tree commit diff
path: root/nptl/sysdeps/pthread
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-02-13 08:32:43 +0000
committerUlrich Drepper <drepper@redhat.com>2004-02-13 08:32:43 +0000
commit219304ecbbb8dab55a788dd3bbb31b3ce01d88a9 (patch)
tree658fa01a840c11bf802e757d8de835bb2f9780a8 /nptl/sysdeps/pthread
parent3730d95c778f794fff48574c95d6658d6d5224ed (diff)
downloadglibc-219304ecbbb8dab55a788dd3bbb31b3ce01d88a9.tar.gz
glibc-219304ecbbb8dab55a788dd3bbb31b3ce01d88a9.tar.xz
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.c21
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;