b63256e69b
* bjm.c: Fix tabulation (such as extra spaces before tabs), convert punctuation where it deviates from prevalent form elsewhere in strace code, convert sizeof and offsetof where it deviates from from prevalent form, remove space between function/macro/array names and (parameters) or [index], add space between "if" and (condition), correct non-standard or wrong indentaion. * defs.h: Likewise * desc.c: Likewise * file.c: Likewise * ipc.c: Likewise * linux/arm/syscallent.h: Likewise * linux/avr32/syscallent.h: Likewise * linux/hppa/syscallent.h: Likewise * linux/i386/syscallent.h: Likewise * linux/ioctlsort.c: Likewise * linux/m68k/syscallent.h: Likewise * linux/microblaze/syscallent.h: Likewise * linux/powerpc/syscallent.h: Likewise * linux/s390/syscallent.h: Likewise * linux/s390x/syscallent.h: Likewise * linux/sh/syscallent.h: Likewise * linux/sh64/syscallent.h: Likewise * linux/tile/syscallent.h: Likewise * linux/x86_64/syscallent.h: Likewise * mem.c: Likewise * net.c: Likewise * pathtrace.c: Likewise * process.c: Likewise * signal.c: Likewise * sock.c: Likewise * strace.c: Likewise * stream.c: Likewise * sunos4/syscall.h: Likewise * sunos4/syscallent.h: Likewise * svr4/syscall.h: Likewise * svr4/syscallent.h: Likewise * syscall.c: Likewise * system.c: Likewise * test/childthread.c: Likewise * test/leaderkill.c: Likewise * test/skodic.c: Likewise * time.c: Likewise * util.c: Likewise Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
61 lines
1.4 KiB
C
61 lines
1.4 KiB
C
/* Test exit of a child of a TCB_EXITING child where the toplevel process starts
|
|
* waiting on it. The middle one gets detached and strace must update the
|
|
* toplevel process'es number of attached children to 0.
|
|
*
|
|
* gcc -o test/childthread test/childthread.c -Wall -ggdb2 -pthread;./strace -f ./test/childthread
|
|
* 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)
|
|
{
|
|
pause();
|
|
/* NOTREACHED */
|
|
assert(0);
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
pthread_t thread0;
|
|
pid_t child, got_pid;
|
|
int status;
|
|
int i;
|
|
|
|
child = fork();
|
|
|
|
switch (child) {
|
|
case -1:
|
|
assert(0);
|
|
case 0:
|
|
i = pthread_create(&thread0, NULL, start0, NULL);
|
|
assert(i == 0);
|
|
/* The thread must be initialized, it becomes thread-child of this
|
|
process-child (child of a child of the toplevel process). */
|
|
sleep(1);
|
|
/* Here the child TCB cannot be deallocated as there still exist
|
|
* children (the thread child in START0). */
|
|
exit(42);
|
|
/* NOTREACHED */
|
|
assert(0);
|
|
default:
|
|
/* We must not be waiting in WAITPID when the child double-exits. */
|
|
sleep(2);
|
|
/* PID must be -1. */
|
|
got_pid = waitpid(-1, &status, 0);
|
|
assert(got_pid == child);
|
|
assert(WIFEXITED(status));
|
|
assert(WEXITSTATUS(status) == 42);
|
|
puts("OK");
|
|
exit(0);
|
|
}
|
|
|
|
/* NOTREACHED */
|
|
assert(0);
|
|
}
|