diff options
Diffstat (limited to 'test/nptl/tst-sem11.c')
-rw-r--r-- | test/nptl/tst-sem11.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/test/nptl/tst-sem11.c b/test/nptl/tst-sem11.c index 6633ddd..a9c616c 100644 --- a/test/nptl/tst-sem11.c +++ b/test/nptl/tst-sem11.c @@ -2,7 +2,14 @@ #include <stdio.h> #include <unistd.h> #include <pthread.h> -#include <internaltypes.h> + +//from internaltypes.h +struct new_sem +{ + unsigned int value; + int private; + unsigned long int nwaiters; +}; #ifndef SEM_WAIT # define SEM_WAIT(s) sem_wait (s) @@ -23,23 +30,28 @@ main (void) { int tries = 5; pthread_t th; - sem_t s; + union + { + sem_t s; + struct new_sem ns; + } u; again: - if (sem_init (&s, 0, 0) != 0) + if (sem_init (&u.s, 0, 0) != 0) { puts ("sem_init failed"); return 1; } - - struct new_sem *is = (struct new_sem *) &s; - - if (is->nwaiters != 0) +#if __HAVE_64B_ATOMICS + if ((u.ns.data >> SEM_NWAITERS_SHIFT) != 0) +#else + if (u.ns.nwaiters != 0) +#endif { puts ("nwaiters not initialized"); return 1; } - if (pthread_create (&th, NULL, tf, &s) != 0) + if (pthread_create (&th, NULL, tf, &u.s) != 0) { puts ("pthread_create failed"); return 1; @@ -62,11 +74,15 @@ main (void) if (r != PTHREAD_CANCELED && --tries > 0) { /* Maybe we get the scheduling right the next time. */ - sem_destroy (&s); + sem_destroy (&u.s); goto again; } - if (is->nwaiters != 0) +#if __HAVE_64B_ATOMICS + if ((u.ns.data >> SEM_NWAITERS_SHIFT) != 0) +#else + if (u.ns.nwaiters != 0) +#endif { puts ("nwaiters not reset"); return 1; |