diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-05-26 01:23:04 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-05-26 01:23:04 +0000 |
commit | 2af4e3e5668f70976762282cfff715e68929aa81 (patch) | |
tree | 980d505143102b6f14936c0ea9f8b156717ec553 /nptl/tst-sem11.c | |
parent | 20a4d7228e33a9cc3e26a7ee935ede53306d8bd3 (diff) | |
download | glibc-2af4e3e5668f70976762282cfff715e68929aa81.zip glibc-2af4e3e5668f70976762282cfff715e68929aa81.tar.gz glibc-2af4e3e5668f70976762282cfff715e68929aa81.tar.bz2 |
Test of semaphores.
Diffstat (limited to 'nptl/tst-sem11.c')
-rw-r--r-- | nptl/tst-sem11.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/nptl/tst-sem11.c b/nptl/tst-sem11.c new file mode 100644 index 0000000..6633ddd --- /dev/null +++ b/nptl/tst-sem11.c @@ -0,0 +1,76 @@ +#include <semaphore.h> +#include <stdio.h> +#include <unistd.h> +#include <pthread.h> +#include <internaltypes.h> + +#ifndef SEM_WAIT +# define SEM_WAIT(s) sem_wait (s) +#endif + +static void * +tf (void *arg) +{ +#ifdef PREPARE + PREPARE +#endif + SEM_WAIT (arg); + return NULL; +} + +int +main (void) +{ + int tries = 5; + pthread_t th; + sem_t s; + again: + if (sem_init (&s, 0, 0) != 0) + { + puts ("sem_init failed"); + return 1; + } + + struct new_sem *is = (struct new_sem *) &s; + + if (is->nwaiters != 0) + { + puts ("nwaiters not initialized"); + return 1; + } + + if (pthread_create (&th, NULL, tf, &s) != 0) + { + puts ("pthread_create failed"); + return 1; + } + + sleep (1); + + if (pthread_cancel (th) != 0) + { + puts ("pthread_cancel failed"); + return 1; + } + + void *r; + if (pthread_join (th, &r) != 0) + { + puts ("pthread_join failed"); + return 1; + } + if (r != PTHREAD_CANCELED && --tries > 0) + { + /* Maybe we get the scheduling right the next time. */ + sem_destroy (&s); + goto again; + } + + if (is->nwaiters != 0) + { + puts ("nwaiters not reset"); + return 1; + } + + return 0; +} |