From 9005607c8fa7317a759f1fc16cae4738f9a2fbb3 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Wed, 30 Jan 2013 13:14:34 +0000 Subject: [PATCH] Rework the handling of the children for the pthread_vfork_test. The trivial handler for SIGCHLD is installed, and SIGCHLD is blocked, to not abandon our zombies to init(8). This way, the zombies are around slightly longer, allowing to actually exercise the logic for p_pwait use by the test. MFC after: 1 week --- tools/test/pthread_vfork/pthread_vfork_test.c | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/tools/test/pthread_vfork/pthread_vfork_test.c b/tools/test/pthread_vfork/pthread_vfork_test.c index e00472713dfd..925c86255738 100644 --- a/tools/test/pthread_vfork/pthread_vfork_test.c +++ b/tools/test/pthread_vfork/pthread_vfork_test.c @@ -29,6 +29,8 @@ #include __FBSDID("$FreeBSD$"); +#include +#include #include #include #include @@ -39,10 +41,11 @@ __FBSDID("$FreeBSD$"); #define NUM_THREADS 100 -void * -vfork_test(void *threadid) +static void * +vfork_test(void *threadid __unused) { - pid_t pid; + pid_t pid, wpid; + int status; for (;;) { pid = vfork(); @@ -50,10 +53,20 @@ vfork_test(void *threadid) _exit(0); else if (pid == -1) err(1, "Failed to vfork"); + else { + wpid = waitpid(pid, &status, 0); + if (wpid == -1) + err(1, "waitpid"); + } } return (NULL); } +static void +sighandler(int signo __unused) +{ +} + /* * This program invokes multiple threads and each thread calls * vfork() system call. @@ -63,19 +76,24 @@ main(void) { pthread_t threads[NUM_THREADS]; struct sigaction reapchildren; + sigset_t sigchld_mask; int rc, t; memset(&reapchildren, 0, sizeof(reapchildren)); - reapchildren.sa_handler = SIG_IGN; - - /* Automatically reap zombies. */ + reapchildren.sa_handler = sighandler; if (sigaction(SIGCHLD, &reapchildren, NULL) == -1) err(1, "Could not sigaction(SIGCHLD)"); + sigemptyset(&sigchld_mask); + sigaddset(&sigchld_mask, SIGCHLD); + if (sigprocmask(SIG_BLOCK, &sigchld_mask, NULL) == -1) + err(1, "sigprocmask"); + for (t = 0; t < NUM_THREADS; t++) { - rc = pthread_create(&threads[t], NULL, vfork_test, (void *)t); + rc = pthread_create(&threads[t], NULL, vfork_test, &t); if (rc) errc(1, rc, "pthread_create"); } + pause(); return (0); }