aboutsummaryrefslogtreecommitdiff
path: root/src/progman.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/progman.c')
-rw-r--r--src/progman.c39
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 */

Return to:

Send suggestions and report system problems to the System administrator.