diff options
-rw-r--r-- | test/nptl/Makefile.in | 4 | ||||
-rw-r--r-- | test/nptl/tst-tls3.c | 9 | ||||
-rw-r--r-- | test/nptl/tst-tls3mod.c | 30 |
3 files changed, 32 insertions, 11 deletions
diff --git a/test/nptl/Makefile.in b/test/nptl/Makefile.in index 6cde3d972..c6d832b9b 100644 --- a/test/nptl/Makefile.in +++ b/test/nptl/Makefile.in @@ -95,7 +95,7 @@ LDFLAGS_tst-clock2 := -lrt LDFLAGS_tst-cond11 := -lrt LDFLAGS_tst-cond19 := -lrt LDFLAGS_tst-rwlock14 := -lrt -LDFLAGS_tst-tls3 := -ldl -rdynamic +LDFLAGS_tst-tls3 := -ldl -rdynamic tst-tls3mod.so LDFLAGS_tst-tls4 := -ldl LDFLAGS_tst-tls5 := tst-tls5mod.so LDFLAGS_tst-clock := -lrt @@ -118,7 +118,7 @@ LDFLAGS_tst-timer2 := -lrt LDFLAGS_tst-timer3 := -lrt LDFLAGS_tst-timer4 := -lrt LDFLAGS_tst-timer5 := -lrt -LDFLAGS_tst-tls3mod.so := -shared -static-libgcc +LDFLAGS_tst-tls3mod.so := -shared -static-libgcc -lpthread LDFLAGS_tst-tls4moda.so := -shared -static-libgcc LDFLAGS_tst-tls4modb.so := -shared -static-libgcc LDFLAGS_tst-tls5mod.so := -shared -static-libgcc -Wl,-soname,tst-tls5mod.so diff --git a/test/nptl/tst-tls3.c b/test/nptl/tst-tls3.c index 411acbdf0..abc5f4cb6 100644 --- a/test/nptl/tst-tls3.c +++ b/test/nptl/tst-tls3.c @@ -113,6 +113,15 @@ do_test (void) exit (1); } + void (*setup_tf) (pthread_barrier_t*, int*, sem_t*) = dlsym(h, "setup_tf"); + if (setup_tf == NULL) + { + puts ("dlsym for setup_tf failed"); + exit(1); + } + + setup_tf (&b, &nsigs, &s); + struct sigaction sa; sa.sa_handler = dlsym (h, "handler"); if (sa.sa_handler == NULL) diff --git a/test/nptl/tst-tls3mod.c b/test/nptl/tst-tls3mod.c index 25f892405..53206d30d 100644 --- a/test/nptl/tst-tls3mod.c +++ b/test/nptl/tst-tls3mod.c @@ -29,13 +29,12 @@ #if HAVE___THREAD -extern pthread_barrier_t b; +static pthread_barrier_t* b = NULL; #define TOTAL_SIGS 1000 -extern int nsigs; - -extern sem_t s; +static int* nsigs = NULL; +static sem_t* s = NULL; static __thread void (*fp) (void); @@ -52,17 +51,30 @@ handler (int sig) fp (); - if (sem_post (&s) != 0) + if (sem_post (s) != 0) { write (STDOUT_FILENO, "sem_post failed\n", 16); _exit (1); } } +void +setup_tf (pthread_barrier_t* t_b, int* t_nsigs, sem_t* t_s) +{ + b = t_b; + nsigs = t_nsigs; + s = t_s; +} void * tf (void *arg) { + if (!b || !s || !nsigs) + { + puts ("need to call setup_tf first"); + exit (1); + } + if ((uintptr_t) pthread_self () & (TCB_ALIGNMENT - 1)) { puts ("thread's struct pthread not aligned enough"); @@ -71,18 +83,18 @@ tf (void *arg) if (fp != NULL) { -printf("fp=%p\n", (void *)&fp); + printf("fp=%p\n", (void *)&fp); puts ("fp not initially NULL"); exit (1); } fp = arg; - pthread_barrier_wait (&b); + pthread_barrier_wait (b); - pthread_barrier_wait (&b); + pthread_barrier_wait (b); - if (nsigs != TOTAL_SIGS) + if (*nsigs != TOTAL_SIGS) { puts ("barrier_wait prematurely returns"); exit (1); |