Now I test for PT_SETOPTIONS being #defined. Remove trailing whitespace. No actual code changes.
65 lines
1.2 KiB
C
65 lines
1.2 KiB
C
/* 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 *start0 (void *arg)
|
|
{
|
|
sleep (1);
|
|
|
|
exit (42);
|
|
}
|
|
|
|
static void *start1 (void *arg)
|
|
{
|
|
pause ();
|
|
/* NOTREACHED */
|
|
assert (0);
|
|
}
|
|
|
|
int main (void)
|
|
{
|
|
pthread_t thread0;
|
|
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 (&thread0, NULL, start0, NULL);
|
|
assert (i == 0);
|
|
i = pthread_create (&thread1, NULL, start1, NULL);
|
|
assert (i == 0);
|
|
pause ();
|
|
/* NOTREACHED */
|
|
assert (0);
|
|
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 ();
|
|
}
|