Blame nptl/tst-getpid3.c

Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <pthread.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
#include <sys/wait.h>
Packit 6c4009
Packit 6c4009
Packit 6c4009
static pid_t pid;
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
pid_thread (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (pid != getpid ())
Packit 6c4009
    {
Packit 6c4009
      printf ("pid wrong in thread: should be %d, is %d\n",
Packit 6c4009
	      (int) pid, (int) getpid ());
Packit 6c4009
      return (void *) 1L;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  return NULL;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  pid = getpid ();
Packit 6c4009
Packit 6c4009
  pthread_t thr;
Packit 6c4009
  int ret = pthread_create (&thr, NULL, pid_thread, NULL);
Packit 6c4009
  if (ret)
Packit 6c4009
    {
Packit 6c4009
      printf ("pthread_create failed: %d\n", ret);
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  void *thr_ret;
Packit 6c4009
  ret = pthread_join (thr, &thr_ret);
Packit 6c4009
  if (ret)
Packit 6c4009
    {
Packit 6c4009
      printf ("pthread_create failed: %d\n", ret);
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
  else if (thr_ret)
Packit 6c4009
    {
Packit 6c4009
      printf ("thread getpid failed\n");
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  pid_t child = fork ();
Packit 6c4009
  if (child == -1)
Packit 6c4009
    {
Packit 6c4009
      printf ("fork failed: %m\n");
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
  else if (child == 0)
Packit 6c4009
    {
Packit 6c4009
      if (pid == getpid ())
Packit 6c4009
	{
Packit 6c4009
	  puts ("pid did not change after fork");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      pid = getpid ();
Packit 6c4009
      ret = pthread_create (&thr, NULL, pid_thread, NULL);
Packit 6c4009
      if (ret)
Packit 6c4009
	{
Packit 6c4009
	  printf ("pthread_create failed: %d\n", ret);
Packit 6c4009
	  return 1;
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      ret = pthread_join (thr, &thr_ret);
Packit 6c4009
      if (ret)
Packit 6c4009
	{
Packit 6c4009
	  printf ("pthread_create failed: %d\n", ret);
Packit 6c4009
	  return 1;
Packit 6c4009
	}
Packit 6c4009
      else if (thr_ret)
Packit 6c4009
	{
Packit 6c4009
	  printf ("thread getpid failed\n");
Packit 6c4009
	  return 1;
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      return 0;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  int status;
Packit 6c4009
  if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child)
Packit 6c4009
    {
Packit 6c4009
      puts ("waitpid failed");
Packit 6c4009
      kill (child, SIGKILL);
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (!WIFEXITED (status))
Packit 6c4009
    {
Packit 6c4009
      if (WIFSIGNALED (status))
Packit 6c4009
	printf ("died from signal %s\n", strsignal (WTERMSIG (status)));
Packit 6c4009
      else
Packit 6c4009
	puts ("did not terminate correctly");
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
  if (WEXITSTATUS (status) != 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("exit code %d\n", WEXITSTATUS (status));
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  return 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#define TEST_FUNCTION do_test ()
Packit 6c4009
#include "../test-skeleton.c"