Back to index

glibc  2.9
tst-robust9.c
Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <errno.h>
00004 #include <pthread.h>
00005 #include <unistd.h>
00006 #include <sys/time.h>
00007 
00008 
00009 static pthread_mutex_t m;
00010 
00011 static void *
00012 tf (void *data)
00013 {
00014   int err = pthread_mutex_lock (&m);
00015   if (err == EOWNERDEAD)
00016     {
00017       err = pthread_mutex_consistent_np (&m);
00018       if (err)
00019        {
00020          puts ("pthread_mutex_consistent_np");
00021          exit (1);
00022        }
00023     }
00024   else if (err)
00025     {
00026       puts ("pthread_mutex_lock");
00027       exit (1);
00028     }
00029   printf ("thread%ld got the lock.\n", (long int) data);
00030   sleep (1);
00031   /* exit without unlock */
00032   return NULL;
00033 }
00034 
00035 static int
00036 do_test (void)
00037 {
00038   int err, i;
00039   pthread_t t[3];
00040   pthread_mutexattr_t ma;
00041 
00042   pthread_mutexattr_init (&ma);
00043   err = pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP);
00044   if (err)
00045     {
00046       puts ("pthread_mutexattr_setrobust_np");
00047       return 1;
00048     }
00049 #ifdef ENABLE_PI
00050   if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_INHERIT) != 0)
00051     {
00052       puts ("pthread_mutexattr_setprotocol failed");
00053       return 1;
00054     }
00055 #endif
00056   err = pthread_mutex_init (&m, &ma);
00057 #ifdef ENABLE_PI
00058   if (err == ENOTSUP)
00059     {
00060       puts ("PI robust mutexes not supported");
00061       return 0;
00062     }
00063 #endif
00064   if (err)
00065     {
00066       puts ("pthread_mutex_init");
00067       return 1;
00068     }
00069 
00070   for (i = 0; i < sizeof (t) / sizeof (t[0]); i++)
00071     {
00072       err = pthread_create (&t[i], NULL, tf, (void *) (long int) i);
00073       if (err)
00074        {
00075          puts ("pthread_create");
00076          return 1;
00077        }
00078     }
00079 
00080   for (i = 0; i < sizeof (t) / sizeof (t[0]); i++)
00081     {
00082       err = pthread_join (t[i], NULL);
00083       if (err)
00084        {
00085          puts ("pthread_join");
00086          return 1;
00087        }
00088     }
00089   return 0;
00090 }
00091 
00092 #define TIMEOUT 5
00093 #define TEST_FUNCTION do_test ()
00094 #include "../test-skeleton.c"