about summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog2
-rw-r--r--nptl/tst-cond2.c37
2 files changed, 23 insertions, 16 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 8d8ff4acf9..05aee28cb5 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,5 +1,7 @@
 2003-02-24  Ulrich Drepper  <drepper@redhat.com>
 
+	* tst-cond2.c: Fix sychronization with child.
+
 	* tst-rwlock8.c (reader_thread): Remove unused variable.
 
 	* Makefile: Add rules to build and run tst-tls3.
diff --git a/nptl/tst-cond2.c b/nptl/tst-cond2.c
index 2610a6ad8c..21bf817b13 100644
--- a/nptl/tst-cond2.c
+++ b/nptl/tst-cond2.c
@@ -26,7 +26,7 @@
 static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
 
-static pthread_mutex_t syncm = PTHREAD_MUTEX_INITIALIZER;
+static pthread_barrier_t bar;
 
 
 static void *
@@ -41,11 +41,14 @@ tf (void *a)
   if (err != 0)
     error (EXIT_FAILURE, err, "locking in child failed");
 
-  printf ("child %d: unlock sync\n", i);
+  printf ("child %d: sync\n", i);
 
-  err = pthread_mutex_unlock (&syncm);
-  if (err != 0)
-    error (EXIT_FAILURE, err, "child %d: unlock[1] failed", i);
+  int e = pthread_barrier_wait (&bar);
+  if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
+    {
+      puts ("child: barrier_wait failed");
+      exit (1);
+    }
 
   printf ("child %d: wait\n", i);
 
@@ -77,11 +80,11 @@ do_test (void)
 
   printf ("&cond = %p\n&mut = %p\n", &cond, &mut);
 
-  puts ("first lock");
-
-  err = pthread_mutex_lock (&syncm);
-  if (err != 0)
-    error (EXIT_FAILURE, err, "initial locking failed");
+  if (pthread_barrier_init (&bar, NULL, 2) != 0)
+    {
+      puts ("barrier_init failed");
+      exit (1);
+    }
 
   for (i = 0; i < N; ++i)
     {
@@ -93,12 +96,14 @@ do_test (void)
 
       printf ("wait for child %d\n", i);
 
-      /* Lock and thereby wait for the child to start up and get the
-	 mutex for the conditional variable.  */
-      pthread_mutex_lock (&syncm);
-      /* Unlock right away.  Yes, we can use barriers but then we
-	 would test more functionality here.  */
-      pthread_mutex_unlock (&syncm);
+      /* Wait for the child to start up and get the mutex for the
+	 conditional variable.  */
+      int e = pthread_barrier_wait (&bar);
+      if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
+	{
+	  puts ("barrier_wait failed");
+	  exit (1);
+	}
     }
 
   puts ("get lock outselves");