Fix up some test cases
[kopensolaris-gnu/glibc.git] / nptl / tst-cond22.c
index 0e829ff..3b55b26 100644 (file)
@@ -1,5 +1,6 @@
 #include <pthreadP.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 
 static pthread_barrier_t b;
@@ -29,11 +30,17 @@ 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.  */
+  do
+    if (pthread_cond_wait (&c, &m) != 0)
+      {
+       printf ("%s: cond_wait failed\n", __func__);
+       exit (1);
+      }
+  while (arg == NULL);
   pthread_cleanup_pop (0);
   if (pthread_mutex_unlock (&m) != 0)
     {
@@ -99,12 +106,14 @@ do_test (void)
       status = 1;
     }
 
+#ifndef OPAQUE_STRUCTS
   printf ("cond = { %d, %x, %lld, %lld, %lld, %p, %u, %u }\n",
          c.__data.__lock, c.__data.__futex, c.__data.__total_seq,
          c.__data.__wakeup_seq, c.__data.__woken_seq, c.__data.__mutex,
          c.__data.__nwaiters, c.__data.__broadcast_seq);
+#endif
 
-  if (pthread_create (&th, NULL, tf, NULL) != 0)
+  if (pthread_create (&th, NULL, tf, (void *) 1l) != 0)
     {
       puts ("2nd create failed");
       return 1;
@@ -141,10 +150,12 @@ do_test (void)
       status = 1;
     }
 
+#ifndef OPAQUE_STRUCTS
   printf ("cond = { %d, %x, %lld, %lld, %lld, %p, %u, %u }\n",
          c.__data.__lock, c.__data.__futex, c.__data.__total_seq,
          c.__data.__wakeup_seq, c.__data.__woken_seq, c.__data.__mutex,
          c.__data.__nwaiters, c.__data.__broadcast_seq);
+#endif
 
   return status;
 }