summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/nptl/Makefile.in4
-rw-r--r--test/nptl/tst-tls3.c9
-rw-r--r--test/nptl/tst-tls3mod.c30
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);