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