Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Feb 2013 13:53:59 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r246405 - stable/9/tools/test/pthread_vfork
Message-ID:  <201302061353.r16DrxgG034668@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Wed Feb  6 13:53:59 2013
New Revision: 246405
URL: http://svnweb.freebsd.org/changeset/base/246405

Log:
  MFC r246119:
  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.

Modified:
  stable/9/tools/test/pthread_vfork/pthread_vfork_test.c
Directory Properties:
  stable/9/tools/test/pthread_vfork/   (props changed)

Modified: stable/9/tools/test/pthread_vfork/pthread_vfork_test.c
==============================================================================
--- stable/9/tools/test/pthread_vfork/pthread_vfork_test.c	Wed Feb  6 13:49:56 2013	(r246404)
+++ stable/9/tools/test/pthread_vfork/pthread_vfork_test.c	Wed Feb  6 13:53:59 2013	(r246405)
@@ -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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302061353.r16DrxgG034668>