From: Roland McGrath Date: Thu, 5 Jul 2007 18:43:18 +0000 (+0000) Subject: 2007-07-05 Jan Kratochvil X-Git-Tag: v4.5.18~218 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e1e57b28407f808962bb4481d678ec03ec5838dd;p=strace 2007-07-05 Jan Kratochvil * test/leaderkill.c: New file. * test/.cvsignore, test/Makefile: Add it. --- diff --git a/test/.cvsignore b/test/.cvsignore index c054dbad..c4152556 100644 --- a/test/.cvsignore +++ b/test/.cvsignore @@ -3,3 +3,4 @@ sig skodic vfork clone +leaderkill diff --git a/test/Makefile b/test/Makefile index cc7c0115..2879c086 100644 --- a/test/Makefile +++ b/test/Makefile @@ -2,8 +2,10 @@ # $Id$ # -all: vfork fork sig skodic clone +all: vfork fork sig skodic clone leaderkill + +leaderkill: LDFLAGS += -pthread clean distclean: - rm -f clone vfork fork sig *.o core + rm -f clone vfork fork sig leaderkill *.o core diff --git a/test/leaderkill.c b/test/leaderkill.c new file mode 100644 index 00000000..51f0c6ce --- /dev/null +++ b/test/leaderkill.c @@ -0,0 +1,59 @@ +/* Test handle_group_exit () handling of a thread leader still alive with its + * thread child calling exit_group () and proper passing of the process exit + * code to the process parent of this whole thread group. + * + * gcc -o test/leaderkill test/leaderkill.c -Wall -ggdb2 -pthread;./test/leaderkill & pid=$!;sleep 1;strace -o x -q ./strace -f -p $pid + * It must print: write(1, "OK\n", ... + */ + +#include +#include +#include +#include +#include +#include + +static void *start (void *arg) +{ + sleep (1); + + exit (42); +} + +int main (void) +{ + pthread_t thread1; + int i; + pid_t child, got_pid; + int status; + + sleep (2); + + child = fork (); + switch (child) + { + case -1: + abort (); + case 0: + i = pthread_create (&thread1, NULL, start, NULL); + assert (i == 0); +/* Two possible testcases; the second one passed even in the older versions. */ +#if 1 + pause (); +#else + pthread_exit (NULL); +#endif + /* NOTREACHED */ + abort (); + break; + default: + got_pid = waitpid (child, &status, 0); + assert (got_pid == child); + assert (WIFEXITED (status)); + assert (WEXITSTATUS (status) == 42); + puts ("OK"); + exit (0); + } + /* NOTREACHED */ + abort (); +}