[BZ #2526, BZ #3138, BZ #3143]
[platform/upstream/glibc.git] / nptl / tst-cond22.c
index 1094c09..e7c8d01 100644 (file)
@@ -30,17 +30,24 @@ tf (void *arg)
       exit (1);
     }
   pthread_cleanup_push (cl, NULL);
-  if (pthread_cond_wait (&c, &m) != 0)
-    {
-      printf ("%s: cond_wait failed\n", __func__);
-      exit (1);
+  /* We have to loop here because the cancellation might come after
+     the cond_wait call left the cancelable area and is then waiting
+     on the mutex.  In this case the beginning of the second cond_wait
+     call will cause the cancellation to happen.  */
+  while (1)
+    {
+      if (pthread_cond_wait (&c, &m) != 0)
+       {
+         printf ("%s: cond_wait failed\n", __func__);
+         exit (1);
+       }
+      if (pthread_mutex_unlock (&m) != 0)
+       {
+         printf ("%s: mutex_unlock failed\n", __func__);
+         exit (1);
+       }
     }
   pthread_cleanup_pop (0);
-  if (pthread_mutex_unlock (&m) != 0)
-    {
-      printf ("%s: mutex_unlock failed\n", __func__);
-      exit (1);
-    }
   return NULL;
 }