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 "."
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to