aboutsummaryrefslogtreecommitdiff
path: root/src/progman.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/progman.c')
-rw-r--r--src/progman.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/progman.c b/src/progman.c
index 5bc4eb3..a625885 100644
--- a/src/progman.c
+++ b/src/progman.c
@@ -315,39 +315,40 @@ register_command (char *tag, char *command, pid_t pid)
newp->v.c.tag = grecs_strdup (tag);
newp->v.c.command = command;
link_prog (newp, progtail);
}
static inline int
progman_startup_phase (void)
{
struct prog *prog;
for (prog = proghead; prog; prog = prog->next)
{
- if (IS_COMPONENT (prog) && prog->v.p.comp->mode == pies_comp_startup)
+ if (IS_COMPONENT (prog) && prog->v.p.comp->mode == pies_comp_startup
+ && prog->v.p.status == status_running)
return 1;
}
return 0;
}
int
progman_waiting_p (void)
{
struct prog *prog;
for (prog = proghead; prog; prog = prog->next)
{
if (IS_COMPONENT (prog)
- && prog->pid > 0
+ && prog->v.p.status == status_running
&& (prog->wait || prog->v.p.comp->mode == pies_comp_startup))
{
debug (3, ("%s: waiting for %s (%lu)",
__FUNCTION__, prog_tag (prog),
(unsigned long) prog->pid));
return 1;
}
}
return 0;
}
RETSIGTYPE
@@ -2347,47 +2348,45 @@ progman_cleanup (int expect_term)
if (listener->v.p.num_instances == 0
&& !component_is_active (prog->v.p.comp))
destroy_prog (&listener);
else
{
if (!expect_term)
react (listener, status, pid);
if (listener->v.p.comp->flags & CF_WAIT)
enable_socket (listener->v.p.socket);
}
destroy_prog (&prog);
}
- else if (prog->v.p.comp->mode == pies_comp_startup)
- {
- debug (1, (_("removing startup component %s, pid=%lu"),
- prog_tag (prog), (unsigned long)pid));
- destroy_prog (&prog);
- if (!progman_startup_phase ())
- pies_schedule_children (PIES_CHLD_WAKEUP);
- }
else
{
if (prog->v.p.comp->mode >= pies_mark_sysvinit
&& prog->v.p.comp->mode != pies_comp_ondemand)
{
sysvinit_acct (SYSV_ACCT_PROC_STOP, "", prog_tag (prog),
pid, "");
prog->v.p.status = status_finished;
if (prog->wait)
{
pies_schedule_children (PIES_CHLD_WAKEUP);
prog->wait = 0;
}
}
+ else if (prog->v.p.comp->mode == pies_comp_startup)
+ {
+ prog->v.p.status = status_finished;
+ if (!progman_startup_phase ())
+ pies_schedule_children (PIES_CHLD_WAKEUP);
+ }
else
{
if (is_sysvinit (prog->v.p.comp))
sysvinit_acct (SYSV_ACCT_PROC_STOP, "",
prog_tag (prog), pid, "");
prog->v.p.status = status_stopped;
prog_stop_dependents (prog);
if (!expect_term)
react (prog, status, pid);
}

Return to:

Send suggestions and report system problems to the System administrator.