about summary refs log tree commit diff
path: root/nptl/tst-robust1.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-02-18 08:41:57 +0000
committerUlrich Drepper <drepper@redhat.com>2006-02-18 08:41:57 +0000
commita93317a17aeb060937b7d896ca589597b33a84d3 (patch)
treecfbf8d194c3a582fad680f4289b8e7ac594c25a5 /nptl/tst-robust1.c
parentf1740bc4e3566cad7620e3b36ca00c0c846ec398 (diff)
downloadglibc-a93317a17aeb060937b7d896ca589597b33a84d3.tar.gz
glibc-a93317a17aeb060937b7d896ca589597b33a84d3.tar.xz
glibc-a93317a17aeb060937b7d896ca589597b33a84d3.zip
* tst-robust1.c: Add second mutex to check that the mutex list is
	handled correctly.
Diffstat (limited to 'nptl/tst-robust1.c')
-rw-r--r--nptl/tst-robust1.c114
1 files changed, 92 insertions, 22 deletions
diff --git a/nptl/tst-robust1.c b/nptl/tst-robust1.c
index 13267a5efd..9806ca467a 100644
--- a/nptl/tst-robust1.c
+++ b/nptl/tst-robust1.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
 
@@ -23,7 +23,8 @@
 #include <stdlib.h>
 
 
-static pthread_mutex_t m;
+static pthread_mutex_t m1;
+static pthread_mutex_t m2;
 static pthread_barrier_t b;
 
 
@@ -43,10 +44,17 @@ tf (void *arg)
       exit (1);
     }
 
-  int e = LOCK (&m);
+  int e = LOCK (&m1);
   if (e != 0)
     {
-      printf ("%ld: child: mutex_lock failed with error %d\n", round, e);
+      printf ("%ld: child: mutex_lock m1 failed with error %d\n", round, e);
+      exit (1);
+    }
+
+  e = LOCK (&m2);
+  if (e != 0)
+    {
+      printf ("%ld: child: mutex_lock m2 failed with error %d\n", round, e);
       exit (1);
     }
 
@@ -90,9 +98,15 @@ do_test (void)
       return 1;
     }
 #ifndef NOT_CONSISTENT
-  if (pthread_mutex_init (&m, &a) != 0)
+  if (pthread_mutex_init (&m1, &a) != 0)
     {
-      puts ("mutex_init failed");
+      puts ("mutex_init m1 failed");
+      return 1;
+    }
+
+  if (pthread_mutex_init (&m2, &a) != 0)
+    {
+      puts ("mutex_init m2 failed");
       return 1;
     }
 #endif
@@ -106,9 +120,14 @@ do_test (void)
   for (long int round = 1; round < 5; ++round)
     {
 #ifdef NOT_CONSISTENT
-      if (pthread_mutex_init (&m, &a) != 0)
+      if (pthread_mutex_init (&m1 , &a) != 0)
+	{
+	  puts ("mutex_init m1 failed");
+	  return 1;
+	}
+      if (pthread_mutex_init (&m2 , &a) != 0)
 	{
-	  puts ("mutex_init failed");
+	  puts ("mutex_init m2 failed");
 	  return 1;
 	}
 #endif
@@ -157,15 +176,27 @@ do_test (void)
 	    }
 	}
 
-      e = LOCK (&m);
+      e = LOCK (&m1);
       if (e == 0)
 	{
-	  printf ("%ld: parent: mutex_lock succeeded\n", round);
+	  printf ("%ld: parent: mutex_lock m1 succeeded\n", round);
 	  return 1;
 	}
       if (e != EOWNERDEAD)
 	{
-	  printf ("%ld: parent: mutex_lock returned wrong code\n", round);
+	  printf ("%ld: parent: mutex_lock m1 returned wrong code\n", round);
+	  return 1;
+	}
+
+      e = LOCK (&m2);
+      if (e == 0)
+	{
+	  printf ("%ld: parent: mutex_lock m2 succeeded\n", round);
+	  return 1;
+	}
+      if (e != EOWNERDEAD)
+	{
+	  printf ("%ld: parent: mutex_lock m2 returned wrong code\n", round);
 	  return 1;
 	}
 
@@ -187,47 +218,86 @@ do_test (void)
 #endif
 
 #ifndef NOT_CONSISTENT
-      e = pthread_mutex_consistent_np (&m);
+      e = pthread_mutex_consistent_np (&m1);
       if (e != 0)
 	{
-	  printf ("%ld: mutex_consistent failed with error %d\n", round, e);
+	  printf ("%ld: mutex_consistent m1 failed with error %d\n", round, e);
+	  return 1;
+	}
+
+      e = pthread_mutex_consistent_np (&m2);
+      if (e != 0)
+	{
+	  printf ("%ld: mutex_consistent m2 failed with error %d\n", round, e);
 	  return 1;
 	}
 #endif
 
-      e = pthread_mutex_unlock (&m);
+      e = pthread_mutex_unlock (&m1);
+      if (e != 0)
+	{
+	  printf ("%ld: mutex_unlock m1 failed\n", round);
+	  return 1;
+	}
+
+      e = pthread_mutex_unlock (&m2);
       if (e != 0)
 	{
-	  printf ("%ld: mutex_unlocked failed\n", round);
+	  printf ("%ld: mutex_unlock m2 failed\n", round);
 	  return 1;
 	}
 
 #ifdef NOT_CONSISTENT
-      e = LOCK (&m);
+      e = LOCK (&m1);
+      if (e == 0)
+	{
+	  printf ("%ld: locking inconsistent mutex m1 succeeded\n", round);
+	  return 1;
+	}
+      if (e != ENOTRECOVERABLE)
+	{
+	  printf ("%ld: locking inconsistent mutex m1 failed with error %d\n",
+		  round, e);
+	  return 1;
+	}
+
+      if (pthread_mutex_destroy (&m1) != 0)
+	{
+	  puts ("mutex_destroy m1 failed");
+	  return 1;
+	}
+
+      e = LOCK (&m2);
       if (e == 0)
 	{
-	  printf ("%ld: locking inconsistent mutex succeeded\n", round);
+	  printf ("%ld: locking inconsistent mutex m2 succeeded\n", round);
 	  return 1;
 	}
       if (e != ENOTRECOVERABLE)
 	{
-	  printf ("%ld: locking inconsistent mutex failed with error %d\n",
+	  printf ("%ld: locking inconsistent mutex m2 failed with error %d\n",
 		  round, e);
 	  return 1;
 	}
 
-      if (pthread_mutex_destroy (&m) != 0)
+      if (pthread_mutex_destroy (&m2) != 0)
 	{
-	  puts ("mutex_destroy failed");
+	  puts ("mutex_destroy m2 failed");
 	  return 1;
 	}
 #endif
     }
 
 #ifndef NOT_CONSISTENT
-  if (pthread_mutex_destroy (&m) != 0)
+  if (pthread_mutex_destroy (&m1) != 0)
+    {
+      puts ("mutex_destroy m1 failed");
+      return 1;
+    }
+
+  if (pthread_mutex_destroy (&m2) != 0)
     {
-      puts ("mutex_destroy failed");
+      puts ("mutex_destroy m2 failed");
       return 1;
     }
 #endif