diff options
Diffstat (limited to 'test/nptl/tst-getpid3.c')
| -rw-r--r-- | test/nptl/tst-getpid3.c | 114 | 
1 files changed, 114 insertions, 0 deletions
| diff --git a/test/nptl/tst-getpid3.c b/test/nptl/tst-getpid3.c new file mode 100644 index 000000000..f1e77f6b1 --- /dev/null +++ b/test/nptl/tst-getpid3.c @@ -0,0 +1,114 @@ +#include <errno.h> +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/wait.h> + + +static pid_t pid; + +static void * +pid_thread (void *arg) +{ +  if (pid != getpid ()) +    { +      printf ("pid wrong in thread: should be %d, is %d\n", +	      (int) pid, (int) getpid ()); +      return (void *) 1L; +    } + +  return NULL; +} + +static int +do_test (void) +{ +  pid = getpid (); + +  pthread_t thr; +  int ret = pthread_create (&thr, NULL, pid_thread, NULL); +  if (ret) +    { +      printf ("pthread_create failed: %d\n", ret); +      return 1; +    } + +  void *thr_ret; +  ret = pthread_join (thr, &thr_ret); +  if (ret) +    { +      printf ("pthread_create failed: %d\n", ret); +      return 1; +    } +  else if (thr_ret) +    { +      printf ("thread getpid failed\n"); +      return 1; +    } + +  pid_t child = fork (); +  if (child == -1) +    { +      printf ("fork failed: %m\n"); +      return 1; +    } +  else if (child == 0) +    { +      if (pid == getpid ()) +	{ +	  puts ("pid did not change after fork"); +	  exit (1); +	} + +      pid = getpid (); +      ret = pthread_create (&thr, NULL, pid_thread, NULL); +      if (ret) +	{ +	  printf ("pthread_create failed: %d\n", ret); +	  return 1; +	} + +      ret = pthread_join (thr, &thr_ret); +      if (ret) +	{ +	  printf ("pthread_create failed: %d\n", ret); +	  return 1; +	} +      else if (thr_ret) +	{ +	  printf ("thread getpid failed\n"); +	  return 1; +	} + +      return 0; +    } + +  int status; +  if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) +    { +      puts ("waitpid failed"); +      kill (child, SIGKILL); +      return 1; +    } + +  if (!WIFEXITED (status)) +    { +      if (WIFSIGNALED (status)) +	printf ("died from signal %s\n", strsignal (WTERMSIG (status))); +      else +	puts ("did not terminate correctly"); +      return 1; +    } +  if (WEXITSTATUS (status) != 0) +    { +      printf ("exit code %d\n", WEXITSTATUS (status)); +      return 1; +    } + +  return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" | 
