diff options
Diffstat (limited to 'src/progman.c')
-rw-r--r-- | src/progman.c | 19 |
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); } |