about summary refs log tree commit diff
path: root/nptl/old_pthread_cond_wait.c
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/old_pthread_cond_wait.c')
-rw-r--r--nptl/old_pthread_cond_wait.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/nptl/old_pthread_cond_wait.c b/nptl/old_pthread_cond_wait.c
index 4d4f9431d5..493f00a3eb 100644
--- a/nptl/old_pthread_cond_wait.c
+++ b/nptl/old_pthread_cond_wait.c
@@ -26,21 +26,26 @@
 #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
 int
 __pthread_cond_wait_2_0 (cond, mutex)
-     pthread_cond_t *cond;
+     pthread_cond_2_0_t *cond;
      pthread_mutex_t *mutex;
 {
-  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_wait (*realp, mutex);
+  return __pthread_cond_wait (cond->cond, mutex);
 }
 compat_symbol (libpthread, __pthread_cond_wait_2_0, pthread_cond_wait,
 	       GLIBC_2_0);