diff options
Diffstat (limited to 'src/progman.c')
-rw-r--r-- | src/progman.c | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/src/progman.c b/src/progman.c index 020dccd..2c73b2b 100644 --- a/src/progman.c +++ b/src/progman.c @@ -29,19 +29,25 @@ progman_locate (const char *name) for (prog = proghead; prog; prog = prog->next) if (strcmp (prog_tag (prog), name) == 0) break; return prog; } -void +int progman_foreach (int (*filter) (struct prog *, void *data), void *data) { struct prog *prog; - for (prog = proghead; prog; prog = prog->next) - if (filter (prog, data)) - break; + int rc = 0; + for (prog = proghead; prog; ) + { + struct prog *next = prog->next; + if ((rc = filter (prog, data)) != 0) + break; + prog = next; + } + return rc; } /* FIXME: Rewrite this using progman_foreach? */ void progman_iterate_comp (int (*fun) (struct component *, void *), void *data) { @@ -309,24 +315,12 @@ progman_waiting_p () return 1; } } return 0; } -size_t -progman_running_count () -{ - size_t size = 0; - struct prog *prog; - - for (prog = proghead; prog; prog = prog->next) - if (prog->pid > 0) - size++; - return size; -} - RETSIGTYPE redir_exit (int sig) { _exit (0); } @@ -1739,13 +1733,13 @@ progman_wait_until (int (*cond) (void *), void *data) return 1; } static int no_children_left (void *p) { - return progman_running_count () == 0; + return proghead == NULL; } void progman_stop () { prog_stop_all (SIGTERM); @@ -2354,56 +2348,57 @@ progman_cleanup (int expect_term) if (!expect_term) /* This will also recompute alarm settings, if necessary */ progman_wake_sleeping (0); } void -progman_stop_component (struct prog *prog) +progman_stop_component (struct prog **progptr) { + struct prog *prog = *progptr; if (prog && IS_COMPONENT (prog)) { switch (prog->v.p.status) { case status_enabled: case status_listener: logmsg (LOG_INFO, _("stopping component `%s'"), prog_tag (prog)); prog_stop (prog, SIGTERM); break; case status_disabled: if (!component_is_active (prog->v.p.comp)) - destroy_prog (&prog); + destroy_prog (progptr); else if (!(prog->v.p.comp->flags & CF_DISABLED)) { logmsg (LOG_INFO, _("enabling component `%s'"), prog_tag (prog)); prog->v.p.status = status_enabled; } break; case status_sleeping: if (!component_is_active (prog->v.p.comp)) - destroy_prog (&prog); + destroy_prog (progptr); else { logmsg (LOG_INFO, _("waking up component `%s'"), prog_tag (prog)); prog->v.p.failcount = 0; } break; default: if (!component_is_active (prog->v.p.comp)) - destroy_prog (&prog); + destroy_prog (progptr); else logmsg (LOG_INFO, _("stopping component `%s': component not started"), prog_tag (prog)); } } } void progman_stop_tag (const char *name) { struct prog *prog = progman_locate (name); - progman_stop_component (prog); + progman_stop_component (&prog); } /* EOF */ |