diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-10-30 09:35:20 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-10-30 09:35:20 -0700 |
commit | 9c04f7c155fb799fa7757b5c8bb52400d0dc2ec5 (patch) | |
tree | 0683255c817e5b300c63ae660d41057f36cca02f /nptl | |
parent | 3005703bb9aff3b2a1b2cf6bbbc92e7eaf91d9a5 (diff) | |
download | glibc-9c04f7c155fb799fa7757b5c8bb52400d0dc2ec5.zip glibc-9c04f7c155fb799fa7757b5c8bb52400d0dc2ec5.tar.gz glibc-9c04f7c155fb799fa7757b5c8bb52400d0dc2ec5.tar.bz2 |
Fix aliasing problem in tst-sem11.
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/ChangeLog | 2 | ||||
-rw-r--r-- | nptl/tst-sem11.c | 18 |
2 files changed, 12 insertions, 8 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index f61cb5c..52176fc 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,5 +1,7 @@ 2009-10-30 Ulrich Drepper <drepper@redhat.com> + * tst-sem11.c (main): Rewrite to avoid aliasing problems. + [BZ #3270] * allocatestack.c (__nptl_setxid): Perform the operation in multiple steps to avoid races with creation and terminations. diff --git a/nptl/tst-sem11.c b/nptl/tst-sem11.c index 6633ddd..5248eba 100644 --- a/nptl/tst-sem11.c +++ b/nptl/tst-sem11.c @@ -23,23 +23,25 @@ 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 (u.ns.nwaiters != 0) { 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 +64,11 @@ 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 (u.ns.nwaiters != 0) { puts ("nwaiters not reset"); return 1; |