(reap_children): Don't change C->file->command_state when dying.

Test it only after calling start_job_command for a new command line.
When no more cmds, just set C->file->update_status.
(start_job_command): When the last line is empty or under -n, set
C->file->update_status.
(start_waiting_job): Grok cs_not_started after start_job_command as success.
(new_job): Set C->file->update_status when there are no cmds.
(job_next_command): When out of lines, don't set CHILD->file->update_status or
CHILD->file->command_state.
This commit is contained in:
Roland McGrath 1994-09-26 23:02:40 +00:00
parent 2feb36f620
commit c62ca42327

53
job.c
View file

@ -21,6 +21,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "job.h" #include "job.h"
#include "file.h" #include "file.h"
#include "variable.h" #include "variable.h"
#include <assert.h>
/* Default path to search for executables. */ /* Default path to search for executables. */
static char default_path[] = ":/bin:/usr/bin"; static char default_path[] = ":/bin:/usr/bin";
@ -402,7 +403,6 @@ reap_children (block, err)
Since there are more commands that wanted to be run, Since there are more commands that wanted to be run,
the target was not completely remade. So we treat the target was not completely remade. So we treat
this as if a command had failed. */ this as if a command had failed. */
c->file->command_state = cs_finished;
c->file->update_status = 1; c->file->update_status = 1;
} }
else else
@ -413,30 +413,29 @@ reap_children (block, err)
by start_remote_job_p. */ by start_remote_job_p. */
c->remote = start_remote_job_p (); c->remote = start_remote_job_p ();
start_job_command (c); start_job_command (c);
if (c->file->command_state == cs_running)
/* We successfully started the new command.
Loop to reap more children. */
continue;
} }
}
switch (c->file->command_state)
{
case cs_running:
/* Successfully started. Loop to reap more children. */
continue;
case cs_finished:
if (c->file->update_status != 0) if (c->file->update_status != 0)
/* We failed to start the commands. */ /* We failed to start the commands. */
delete_child_targets (c); delete_child_targets (c);
break;
default:
error ("internal error: `%s' has bogus command_state \
%d in reap_children",
c->file->name, (int) c->file->command_state);
abort ();
break;
} }
else
/* There are no more commands. We got through them all
without an unignored error. Now the target has been
successfully updated. */
c->file->update_status = 0;
} }
/* When we get here, all the commands for C->file are finished
(or aborted) and C->file->update_status contains 0 or 1. But
C->file->command_state is still cs_running if all the commands
ran; notice_finish_file looks for cs_running to tell it that
it's interesting to check the file's modtime again now. */
if (! handling_fatal_signal) if (! handling_fatal_signal)
/* Notice if the target of the commands has been changed. /* Notice if the target of the commands has been changed.
This also propagates its values for command_state and This also propagates its values for command_state and
@ -584,6 +583,7 @@ start_job_command (child)
/* This line has no commands. Go to the next. */ /* This line has no commands. Go to the next. */
if (job_next_command (child)) if (job_next_command (child))
start_job_command (child); start_job_command (child);
child->file->update_status = 0;
return; return;
} }
@ -609,6 +609,7 @@ start_job_command (child)
free ((char *) argv); free ((char *) argv);
if (job_next_command (child)) if (job_next_command (child))
start_job_command (child); start_job_command (child);
child->file->update_status = 0;
return; return;
} }
@ -774,15 +775,18 @@ start_waiting_job (c)
unblock_sigs (); unblock_sigs ();
break; break;
case cs_not_started:
/* All the command lines turned out to be empty. */
c->file->update_status = 0;
/* FALLTHROUGH */
case cs_finished: case cs_finished:
notice_finished_file (c->file); notice_finished_file (c->file);
free_child (c); free_child (c);
break; break;
default: default:
error ("internal error: `%s' command_state == %d in new_job", assert (c->file->command_state == cs_finished);
c->file->name, (int) c->file->command_state);
abort ();
break; break;
} }
@ -928,8 +932,11 @@ new_job (file)
/* Fetch the first command line to be run. */ /* Fetch the first command line to be run. */
if (! job_next_command (c)) if (! job_next_command (c))
/* There were no commands! */ {
free_child (c); /* There were no commands! */
free_child (c);
c->file->update_status = 0;
}
else else
{ {
/* The job is now primed. Start it running. */ /* The job is now primed. Start it running. */
@ -957,8 +964,6 @@ job_next_command (child)
{ {
/* There are no more lines to be expanded. */ /* There are no more lines to be expanded. */
child->command_ptr = 0; child->command_ptr = 0;
child->file->command_state = cs_finished;
child->file->update_status = 0;
return 0; return 0;
} }
else else