summaryrefslogtreecommitdiffstats
path: root/tools/test/pthread_vfork
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2013-01-30 13:14:34 +0000
committerkib <kib@FreeBSD.org>2013-01-30 13:14:34 +0000
commit7b6927c4af42d3e6a1b704f87f0eae971121b096 (patch)
treec95e6ec114d4deda31ad644548a4ccce99b5c95c /tools/test/pthread_vfork
parente81abcec51f86929c209e6be2e354198be170d50 (diff)
downloadFreeBSD-src-7b6927c4af42d3e6a1b704f87f0eae971121b096.zip
FreeBSD-src-7b6927c4af42d3e6a1b704f87f0eae971121b096.tar.gz
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
Diffstat (limited to 'tools/test/pthread_vfork')
-rw-r--r--tools/test/pthread_vfork/pthread_vfork_test.c32
1 files 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 e004727..925c862 100644
--- a/tools/test/pthread_vfork/pthread_vfork_test.c
+++ b/tools/test/pthread_vfork/pthread_vfork_test.c
@@ -29,6 +29,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/wait.h>
#include <err.h>
#include <pthread.h>
#include <signal.h>
@@ -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);
}
OpenPOWER on IntegriCloud