diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2010-10-11 14:49:26 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2010-10-11 15:19:40 -0700 |
commit | 011c1d1c0766c65517ebd495465c99e86edb63ec (patch) | |
tree | 30d8f6a13235af90897c3223554871ef52225462 /nojobs.c | |
parent | 40cfaccf7b178b6239b5cd0013ef80b7ff8e503e (diff) | |
download | vyatta-bash-011c1d1c0766c65517ebd495465c99e86edb63ec.tar.gz vyatta-bash-011c1d1c0766c65517ebd495465c99e86edb63ec.zip |
Update to bash-4.1
Diffstat (limited to 'nojobs.c')
-rw-r--r-- | nojobs.c | 72 |
1 files changed, 41 insertions, 31 deletions
@@ -1,25 +1,25 @@ -/* The thing that makes children, remembers them, and contains wait loops. */ +/* nojobs.c - functions that make children, remember them, and handle their termination. */ /* This file works under BSD, System V, minix, and Posix systems. It does not implement job control. */ -/* Copyright (C) 1987-2006 Free Software Foundation, Inc. +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. - Bash is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2, or (at your option) any later - version. + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - Bash is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. + Bash is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with Bash; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + You should have received a copy of the GNU General Public License + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ #include "config.h" @@ -45,6 +45,7 @@ #include "shell.h" #include "jobs.h" +#include "execute_cmd.h" #include "builtins/builtext.h" /* for wait_builtin */ @@ -232,7 +233,7 @@ find_termsig_by_pid (pid) return (0); if (pid_list[i].flags & PROC_RUNNING) return (0); - return (get_termsig (pid_list[i].status)); + return (get_termsig ((WAIT)pid_list[i].status)); } /* Set LAST_COMMAND_EXIT_SIGNAL depending on STATUS. If STATUS is -1, look @@ -256,6 +257,10 @@ set_pid_status (pid, status) { int slot; +#if defined (COPROCESS_SUPPORT) + coproc_pidchk (pid, status); +#endif + slot = find_index_by_pid (pid); if (slot == NO_PID) return; @@ -387,6 +392,10 @@ cleanup_dead_jobs () pid_list[i].pid = NO_PID; } +#if defined (COPROCESS_SUPPORT) + coproc_reap (); +#endif + return 0; } @@ -465,9 +474,7 @@ make_child (command, async_p) int async_p; { pid_t pid; -#if defined (HAVE_WAITPID) - int retry = 1; -#endif /* HAVE_WAITPID */ + int forksleep; /* Discard saved memory. */ if (command) @@ -484,26 +491,27 @@ make_child (command, async_p) sync_buffered_stream (default_buffered_input); #endif /* BUFFERED_INPUT */ - /* Create the child, handle severe errors. */ -#if defined (HAVE_WAITPID) - retry_fork: -#endif /* HAVE_WAITPID */ - - if ((pid = fork ()) < 0) + /* Create the child, handle severe errors. Retry on EAGAIN. */ + forksleep = 1; + while ((pid = fork ()) < 0 && errno == EAGAIN && forksleep < FORKSLEEP_MAX) { + sys_error ("fork: retry"); #if defined (HAVE_WAITPID) /* Posix systems with a non-blocking waitpid () system call available get another chance after zombies are reaped. */ - if (errno == EAGAIN && retry) - { - reap_zombie_children (); - retry = 0; - goto retry_fork; - } + reap_zombie_children (); + if (forksleep > 1 && sleep (forksleep) != 0) + break; +#else + if (sleep (forksleep) != 0) + break; #endif /* HAVE_WAITPID */ + forksleep <<= 1; + } + if (pid < 0) + { sys_error ("fork"); - throw_to_top_level (); } @@ -518,9 +526,11 @@ make_child (command, async_p) sigprocmask (SIG_SETMASK, &top_level_mask, (sigset_t *)NULL); #endif +#if 0 /* Ignore INT and QUIT in asynchronous children. */ if (async_p) last_asynchronous_pid = getpid (); +#endif default_tty_job_signals (); } @@ -801,7 +811,7 @@ wait_for (pid) { fprintf (stderr, "%s", j_strsignal (WTERMSIG (status))); if (WIFCORED (status)) - fprintf (stderr, " (core dumped)"); + fprintf (stderr, _(" (core dumped)")); fprintf (stderr, "\n"); } |