svn commit: r206248 - head/etc

Doug Barton dougb at FreeBSD.org
Tue Apr 6 05:20:46 UTC 2010


Author: dougb
Date: Tue Apr  6 05:20:46 2010
New Revision: 206248
URL: http://svn.freebsd.org/changeset/base/206248

Log:
  In wait_for_pids(), pwait(1) can return when the process exits, but
  still exists as a zombie. The 'kill -0' test in this function can
  therefore return true even if the process isn't actually running.
  This could lead to wait_for_pids() printing an endless string of the
  pid number until the zombie finally exits.
  
  Solve this problem by moving the sleep up to after the 'kill -0' test, but
  only after we've run through the function once already. In the common case
  (only one pid in the list) this will always do the right thing. On the rare
  occasion that there is more than one pid in the list this will sleep 1
  second per zombie process which will allow that process, and any other
  in the list a chance to exit.
  
  While I'm here, local'ize the variables that this function uses.

Modified:
  head/etc/rc.subr

Modified: head/etc/rc.subr
==============================================================================
--- head/etc/rc.subr	Tue Apr  6 05:13:04 2010	(r206247)
+++ head/etc/rc.subr	Tue Apr  6 05:20:46 2010	(r206248)
@@ -355,6 +355,8 @@ _find_processes()
 #
 wait_for_pids()
 {
+	local _list _prefix _nlist _j
+
 	_list="$@"
 	if [ -z "$_list" ]; then
 		return
@@ -365,6 +367,7 @@ wait_for_pids()
 		for _j in $_list; do
 			if kill -0 $_j 2>/dev/null; then
 				_nlist="${_nlist}${_nlist:+ }$_j"
+				[ -n "$_prefix" ] && sleep 1
 			fi
 		done
 		if [ -z "$_nlist" ]; then
@@ -373,7 +376,7 @@ wait_for_pids()
 		_list=$_nlist
 		echo -n ${_prefix:-"Waiting for PIDS: "}$_list
 		_prefix=", "
-		pwait $_list 2>/dev/null || sleep 2
+		pwait $_list 2>/dev/null
 	done
 	if [ -n "$_prefix" ]; then
 		echo "."


More information about the svn-src-head mailing list