kern/109946: [kernel] [patch] Compatibility: FreeBSD has been missing WNOWAIT flag for wait*() calls://undefined

Jukka A. Ukkonen jau at
Wed Mar 7 08:20:10 UTC 2007

The following reply was made to PR kern/109946; it has been noted by GNATS.

From: "Jukka A. Ukkonen" <jau at>
To: bug-followup at, jau at
Subject: Re: kern/109946: [kernel] [patch] Compatibility: FreeBSD has been
 missing WNOWAIT flag for wait*() calls://undefined
Date: Wed, 07 Mar 2007 10:06:28 +0200

 This is a MIME-formatted message.  If you see this text it means that your
 E-mail software does not support MIME-formatted messages.
 Content-Type: text/plain; charset=iso-8859-15
 Content-Transfer-Encoding: 7bit
 	Reverse the if-condition to read
 		if (options & WNOWAIT) {
 	The version I attached seems to be an older diff
 	which I - obviously - cannot be using myself, because
 	doing the the wrong way would quickly end up never
 	cleaning the zombies away from the proc table.
 	I originally intended to do the test the other way
 	around enveloping the whole proc entry cleanup in
 	an if block, but then I decided to favour readability
 	and to cut the whole thing short by unlocking and
 	returning early.
 	The bad news is I made an intermediate diff for myself
 	while I had already added shortcut return but had not
 	yet reversed the if-test. Though I made another diff
 	after changing the if-test direction as well, I still
 	somehow managed to attach the wrong one to the PR. Sigh!
 	Additionally it might make sense to do the shortcut
 	return already before the "ptrace attach" test/block
 	but after the PROC_UNLOCK(p); line when rusage has
 	been filled in.
 	So, I attach a modified patch which in addition to
 	showing the proper WNOWAIT test also moves the WNOWAIT
 	test before the ptrace attach test.
 		// jau
 Content-Type: text/x-patch; name="wait-WNOWAIT.patch"; charset=iso-8859-1
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
 --- src/sys/sys/wait.h.orig	Mon Mar  5 20:11:30 2007
 +++ src/sys/sys/wait.h	Mon Mar  5 20:40:32 2007
 @@ -78,7 +78,9 @@
  #define	WNOHANG		1	/* Don't hang in wait. */
  #define	WUNTRACED	2	/* Tell about stopped, untraced children. */
 +#define	WSTOPPED	WUNTRACED   /* SUS compatibility */
  #define	WCONTINUED	4	/* Report a job control continued process. */
 +#define	WNOWAIT		8	/* Poll only. Don't delete the proc entry. */
  #define	WLINUXCLONE 0x80000000	/* Wait for kthread spawned from linux_clone. */
 --- src/sys/kern/kern_exit.c.orig	Mon Mar  5 20:17:19 2007
 +++ src/sys/kern/kern_exit.c	Wed Mar  7 09:46:01 2007
 @@ -590,7 +590,7 @@
  		pid = -q->p_pgid;
  		return (EINVAL);
  	if (q->p_flag & P_STATCHILD) {
 @@ -650,11 +650,32 @@
  				calcru(p, &rusage->ru_utime, &rusage->ru_stime);
 +			PROC_UNLOCK(p);
 +			if (options & WNOWAIT) {
 +				/*
 +				 *  SUS compatibility.
 +				 *
 +				 *  We poll only returning the status.
 +				 *  We do not wish to release the proc
 +				 *  struct just yet.
 +				 *  ==> If another thread created this
 +				 *  process, it is sometimes better to
 +				 *  leave this one as is for now and let
 +				 *  the other thread reap the remnants
 +				 *  of the child instead of automatically
 +				 *  destroying the proc entry and making
 +				 *  it impossible for the other thread to
 +				 *  wait for its own child process.
 +				 */
 +				sx_xunlock(&proctree_lock);
 +				return (0);
 +			}
  			 * If we got the child via a ptrace 'attach',
  			 * we need to give it back to the old parent.
 -			PROC_UNLOCK(p);
  			if (p->p_oppid && (t = pfind(p->p_oppid)) != NULL) {
  				p->p_oppid = 0;

More information about the freebsd-bugs mailing list