summary refs log tree commit diff
path: root/nptl/old_pthread_cond_timedwait.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-01-03 19:13:49 +0000
committerUlrich Drepper <drepper@redhat.com>2003-01-03 19:13:49 +0000
commit997256dd68532c45c5f1d7e87acffcce8f195476 (patch)
tree1e35f8bcc487d7be4a09f7405105db5c6f98c020 /nptl/old_pthread_cond_timedwait.c
parent8439150e8a3fe76e936e8b258d853633ceb2c3e2 (diff)
downloadglibc-997256dd68532c45c5f1d7e87acffcce8f195476.tar.gz
glibc-997256dd68532c45c5f1d7e87acffcce8f195476.tar.xz
glibc-997256dd68532c45c5f1d7e87acffcce8f195476.zip
Update.
	* pthreadP.h (pthread_cond_2_0_t): New type.
	(struct pthread_functions): Use new type for 2.0 condvar callbacks.
	Use new type for the 2.0 condvar function prototypes.
	* forward.c: Use pthread_cond_2_0_t for 2.0 condvar functions.
	* old_pthread_cond_init.c: Use pthread_cond_2_0_t for condvar
	parameter.
	* old_pthread_cond_destroy.c: Likewise.
	* old_pthread_cond_broadcast.c: Likewise.  Lock appropriately.
	* old_pthread_cond_signal.c: Likewise.
	* old_pthread_cond_timedwait.c: Likewise.
	* old_pthread_cond_wait.c: Likewise.
Diffstat (limited to 'nptl/old_pthread_cond_timedwait.c')
-rw-r--r--nptl/old_pthread_cond_timedwait.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/nptl/old_pthread_cond_timedwait.c b/nptl/old_pthread_cond_timedwait.c
index 6f844346fd..7b0faa78d2 100644
--- a/nptl/old_pthread_cond_timedwait.c
+++ b/nptl/old_pthread_cond_timedwait.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -25,24 +25,29 @@
 
 #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
 int
-__old_pthread_cond_timedwait (cond, mutex, abstime)
-     pthread_cond_t *cond;
+__pthread_cond_timedwait_2_0 (cond, mutex, abstime)
+     pthread_cond_2_0_t *cond;
      pthread_mutex_t *mutex;
      const struct timespec *abstime;
 {
-  pthread_cond_t **realp = (pthread_cond_t **) cond;
-
-  if (*realp == NULL)
+  if (cond->cond == NULL)
     {
-      *realp = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
-      if (*realp == NULL)
+      lll_mutex_lock (cond->lock);
+
+      /* Check whether the condvar is still not allocated.  */
+      if (cond->cond == NULL)
+	cond->cond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t));
+
+      lll_mutex_unlock (cond->lock);
+
+      if (cond->cond == NULL)
 	return ENOMEM;
 
-      **realp = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER;
+      *cond->cond = (struct pthread_cond_t) PTHREAD_COND_INITIALIZER;
     }
 
-  return __pthread_cond_timedwait (*realp, mutex, abstime);
+  return __pthread_cond_timedwait (cond->cond, mutex, abstime);
 }
-compat_symbol (libpthread, __old_pthread_cond_timedwait,
+compat_symbol (libpthread, __pthread_cond_timedwait_2_0,
 	       pthread_cond_timedwait, GLIBC_2_0);
 #endif