+#if defined (JOB_CONTROL) && defined (SIGCHLD)
+ else if (sig == SIGCHLD &&
+ trap_list[SIGCHLD] != (char *)IMPOSSIBLE_TRAP_HANDLER &&
+ (sigmodes[SIGCHLD] & SIG_INPROGRESS) == 0)
+ {
+ sigmodes[SIGCHLD] |= SIG_INPROGRESS;
+ run_sigchld_trap (pending_traps[sig]); /* use as counter */
+ sigmodes[SIGCHLD] &= ~SIG_INPROGRESS;
+ }
+ else if (sig == SIGCHLD &&
+ trap_list[SIGCHLD] == (char *)IMPOSSIBLE_TRAP_HANDLER &&
+ (sigmodes[SIGCHLD] & SIG_INPROGRESS) != 0)
+ {
+ /* This can happen when run_pending_traps is called while
+ running a SIGCHLD trap handler. */
+ running_trap = 0;
+ /* want to leave pending_traps[SIGCHLD] alone here */
+ continue; /* XXX */
+ }
+ else if (sig == SIGCHLD && (sigmodes[SIGCHLD] & SIG_INPROGRESS))
+ {
+ /* whoops -- print warning? */
+ running_trap = 0; /* XXX */
+ /* want to leave pending_traps[SIGCHLD] alone here */
+ continue;
+ }
+#endif