| #include <stdio.h> |
| #include <stdlib.h> |
| #include <errno.h> |
| #include <pthread.h> |
| #include <unistd.h> |
| #include <sys/time.h> |
| |
| |
| static pthread_mutex_t m; |
| |
| static void * |
| tf (void *data) |
| { |
| int err = pthread_mutex_lock (&m); |
| if (err == EOWNERDEAD) |
| { |
| err = pthread_mutex_consistent_np (&m); |
| if (err) |
| { |
| puts ("pthread_mutex_consistent_np"); |
| exit (1); |
| } |
| } |
| else if (err) |
| { |
| puts ("pthread_mutex_lock"); |
| exit (1); |
| } |
| printf ("thread%ld got the lock.\n", (long int) data); |
| sleep (1); |
| /* exit without unlock */ |
| return NULL; |
| } |
| |
| static int |
| do_test (void) |
| { |
| int err, i; |
| pthread_t t[3]; |
| pthread_mutexattr_t ma; |
| |
| pthread_mutexattr_init (&ma); |
| err = pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP); |
| if (err) |
| { |
| puts ("pthread_mutexattr_setrobust_np"); |
| return 1; |
| } |
| #ifdef ENABLE_PI |
| if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_INHERIT) != 0) |
| { |
| puts ("pthread_mutexattr_setprotocol failed"); |
| return 1; |
| } |
| #endif |
| err = pthread_mutex_init (&m, &ma); |
| #ifdef ENABLE_PI |
| if (err == ENOTSUP) |
| { |
| puts ("PI robust mutexes not supported"); |
| return 0; |
| } |
| #endif |
| if (err) |
| { |
| puts ("pthread_mutex_init"); |
| return 1; |
| } |
| |
| for (i = 0; i < sizeof (t) / sizeof (t[0]); i++) |
| { |
| err = pthread_create (&t[i], NULL, tf, (void *) (long int) i); |
| if (err) |
| { |
| puts ("pthread_create"); |
| return 1; |
| } |
| } |
| |
| for (i = 0; i < sizeof (t) / sizeof (t[0]); i++) |
| { |
| err = pthread_join (t[i], NULL); |
| if (err) |
| { |
| puts ("pthread_join"); |
| return 1; |
| } |
| } |
| return 0; |
| } |
| |
| #define TIMEOUT 5 |
| #define TEST_FUNCTION do_test () |
| #include "../test-skeleton.c" |