diff --git a/job.c b/job.c index 9703c744..19b28dab 100644 --- a/job.c +++ b/job.c @@ -333,12 +333,24 @@ reap_children (block, err) /* If there are more commands to run, try to start them. */ if (job_next_command (c)) { - /* Check again whether to start remotely. - Whether or not we want to changes over time. - Also, start_remote_job may need state set up - by start_remote_job_p. */ - c->remote = start_remote_job_p (); - start_job_command (c); + if (handling_fatal_signal) + { + /* Never start new commands while we are dying. + Since there are more commands that wanted to be run, + the target was not completely remade. So we treat + this as if a command had failed. */ + c->file->command_state = cs_finished; + c->file->update_status = 1; + } + else + { + /* Check again whether to start remotely. + Whether or not we want to changes over time. + Also, start_remote_job may need state set up + by start_remote_job_p. */ + c->remote = start_remote_job_p (); + start_job_command (c); + } } switch (c->file->command_state) @@ -362,8 +374,9 @@ reap_children (block, err) } } - /* Notice if the target of the commands has been changed. */ - notice_finished_file (c->file); + if (! handling_fatal_signal) + /* Notice if the target of the commands has been changed. */ + notice_finished_file (c->file); if (debug_flag) printf ("Removing child 0x%08lx PID %d%s from chain.\n", @@ -375,7 +388,8 @@ reap_children (block, err) children = c->next; else lastc->next = c->next; - free_child (c); + if (! handling_fatal_signal) /* Avoid nonreentrancy. */ + free_child (c); /* There is now another slot open. */ --job_slots_used;