diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-08-21 23:55:36 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-08-21 23:55:36 +0000 |
commit | 2a01ce56b7d585c0e760ba27e0a07819f3b8b723 (patch) | |
tree | 3b598b3518db114c32997054a406ae07d27558cf /nptl/tst-tsd6.c | |
parent | 45dc3ad77e9ab9648365866c64650593114c84fb (diff) | |
download | glibc-2a01ce56b7d585c0e760ba27e0a07819f3b8b723.zip glibc-2a01ce56b7d585c0e760ba27e0a07819f3b8b723.tar.gz glibc-2a01ce56b7d585c0e760ba27e0a07819f3b8b723.tar.bz2 |
[BZ #4938]
2007-08-21 Ulrich Drepper <drepper@redhat.com>
[BZ #4938]
* allocatestack.c (__reclaim_stacks): Clear the TSD in the
reclaimed stack if necessary.
* Makefile (tests): Add tst-tsd6.
* tst-tsd6.c: New file.
Diffstat (limited to 'nptl/tst-tsd6.c')
-rw-r--r-- | nptl/tst-tsd6.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/nptl/tst-tsd6.c b/nptl/tst-tsd6.c new file mode 100644 index 0000000..debb1dd --- /dev/null +++ b/nptl/tst-tsd6.c @@ -0,0 +1,89 @@ +#include <errno.h> +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/wait.h> + +#define NKEYS 100 +static pthread_key_t keys[NKEYS]; +static pthread_barrier_t b; + + +static void * +tf (void *arg) +{ + void *res = NULL; + for (int i = 0; i < NKEYS; ++i) + { + void *p = pthread_getspecific (keys[i]); + pthread_setspecific (keys[i], (void *) 7); + if (p != NULL) + res = p; + } + if (arg != NULL) + { + pthread_barrier_wait (arg); + pthread_barrier_wait (arg); + } + return res; +} + + +static int +do_test (void) +{ + pthread_barrier_init (&b, NULL, 2); + + for (int i = 0; i < NKEYS; ++i) + if (pthread_key_create (&keys[i], NULL) != 0) + { + puts ("cannot create keys"); + return 1; + } + + pthread_t th; + if (pthread_create (&th, NULL, tf, &b) != 0) + { + puts ("cannot create thread in parent"); + return 1; + } + + pthread_barrier_wait (&b); + + pid_t pid = fork (); + if (pid == 0) + { + if (pthread_create (&th, NULL, tf, NULL) != 0) + { + puts ("cannot create thread in child"); + exit (1); + } + + void *res; + pthread_join (th, &res); + + exit (res != NULL); + } + else if (pid == -1) + { + puts ("cannot create child process"); + return 1; + } + + int s; + if (TEMP_FAILURE_RETRY (waitpid (pid, &s, 0)) != pid) + { + puts ("failing to wait for child process"); + return 1; + } + + pthread_barrier_wait (&b); + pthread_join (th, NULL); + + return !WIFEXITED (s) ? 2 : WEXITSTATUS (s); +} + + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |