Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
[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.
- Loading branch information
Ulrich Drepper
committed
Aug 21, 2007
1 parent
45dc3ad
commit 2a01ce5
Showing
4 changed files
with
118 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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" |