| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | #include <errno.h>#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>#define NKEYS 100static 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 intdo_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"
 |