Blame nptl/tst-tsd6.c

Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <pthread.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
#include <sys/wait.h>
Packit 6c4009
Packit 6c4009
#define NKEYS 100
Packit 6c4009
static pthread_key_t keys[NKEYS];
Packit 6c4009
static pthread_barrier_t b;
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf (void *arg)
Packit 6c4009
{
Packit 6c4009
  void *res = NULL;
Packit 6c4009
  for (int i = 0; i < NKEYS; ++i)
Packit 6c4009
    {
Packit 6c4009
      void *p = pthread_getspecific (keys[i]);
Packit 6c4009
      pthread_setspecific (keys[i], (void *) 7);
Packit 6c4009
      if (p != NULL)
Packit 6c4009
	res = p;
Packit 6c4009
    }
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    {
Packit 6c4009
      pthread_barrier_wait (arg);
Packit 6c4009
      pthread_barrier_wait (arg);
Packit 6c4009
    }
Packit 6c4009
  return res;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  pthread_barrier_init (&b, NULL, 2);
Packit 6c4009
Packit 6c4009
  for (int i = 0; i < NKEYS; ++i)
Packit 6c4009
    if (pthread_key_create (&keys[i], NULL) != 0)
Packit 6c4009
      {
Packit 6c4009
	puts ("cannot create keys");
Packit 6c4009
	return 1;
Packit 6c4009
      }
Packit 6c4009
Packit 6c4009
  pthread_t th;
Packit 6c4009
  if (pthread_create (&th, NULL, tf, &b) != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("cannot create thread in parent");
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  pthread_barrier_wait (&b);
Packit 6c4009
Packit 6c4009
  pid_t pid = fork ();
Packit 6c4009
  if (pid == 0)
Packit 6c4009
    {
Packit 6c4009
      if (pthread_create (&th, NULL, tf, NULL) != 0)
Packit 6c4009
	{
Packit 6c4009
	  puts ("cannot create thread in child");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      void *res;
Packit 6c4009
      pthread_join (th, &res;;
Packit 6c4009
Packit 6c4009
      exit (res != NULL);
Packit 6c4009
    }
Packit 6c4009
  else if (pid == -1)
Packit 6c4009
    {
Packit 6c4009
      puts ("cannot create child process");
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  int s;
Packit 6c4009
  if (TEMP_FAILURE_RETRY (waitpid (pid, &s, 0)) != pid)
Packit 6c4009
    {
Packit 6c4009
      puts ("failing to wait for child process");
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  pthread_barrier_wait (&b);
Packit 6c4009
  pthread_join (th, NULL);
Packit 6c4009
Packit 6c4009
  return !WIFEXITED (s) ? 2 : WEXITSTATUS (s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
#define TEST_FUNCTION do_test ()
Packit 6c4009
#include "../test-skeleton.c"