2007-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>

* test/leaderkill.c: New file.
	* test/.cvsignore, test/Makefile: Add it.
This commit is contained in:
Roland McGrath 2007-07-05 18:43:18 +00:00
parent 0a46388034
commit e1e57b2840
3 changed files with 64 additions and 2 deletions

View File

@ -3,3 +3,4 @@ sig
skodic
vfork
clone
leaderkill

View File

@ -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

59
test/leaderkill.c Normal file
View File

@ -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 <pthread.h>
#include <assert.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
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 ();
}