diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-05-18 00:55:10 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-05-18 00:55:10 +0000 |
commit | 113ad5fc9192340269d2ce19b896d51309e785ea (patch) | |
tree | 0028c672ecec9626a07fa3dfc5bcba89b690d2f4 /nptl/tst-robust9.c | |
parent | bec51a302f0e7046fcb8c4fcd13ea2969a43a9b7 (diff) | |
download | glibc-113ad5fc9192340269d2ce19b896d51309e785ea.tar glibc-113ad5fc9192340269d2ce19b896d51309e785ea.tar.gz glibc-113ad5fc9192340269d2ce19b896d51309e785ea.tar.bz2 glibc-113ad5fc9192340269d2ce19b896d51309e785ea.zip |
[BZ #4512]
* pthread_mutex_lock.c: Preserve FUTEX_WAITERS bit when dead owner
is detected.
* pthread_mutex_timedlock.c: Likewise.
* pthread_mutex_trylock.c: Likewise.
Patch in part by Atsushi Nemoto <anemo@mba.ocn.ne.jp>.
* Makefile (tests): Add tst-robust9 and tst-robustpi9.
* tst-robust9.c: New file.
* tst-robustpi9.c: New file.
Diffstat (limited to 'nptl/tst-robust9.c')
-rw-r--r-- | nptl/tst-robust9.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/nptl/tst-robust9.c b/nptl/tst-robust9.c new file mode 100644 index 0000000000..20cbd062dc --- /dev/null +++ b/nptl/tst-robust9.c @@ -0,0 +1,87 @@ +#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); + 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" |