1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #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"
|