diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-12 18:10:09 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-12 18:10:09 +0000 |
commit | 27f32531cccac2b4745a63506a3a363a4e82f633 (patch) | |
tree | 38d87eadb63ffd8e849bf4675c76a8a73b846a17 /pies | |
parent | 378f6d3a07bc1deb56160a464786a43b1c1907ac (diff) | |
download | pies-27f32531cccac2b4745a63506a3a363a4e82f633.tar.gz pies-27f32531cccac2b4745a63506a3a363a4e82f633.tar.bz2 |
Implement dependencies/prerequisites in MeTA1.
* pies/pies.c (component_cfg_param): Rename "depend" to
"prerequisites". Add new keyword "dependents".
(pies_cfg_param): New keyword "limits".
* pies/progman.c (struct prog): Rename "depend" to "prereq".
(prog_start_dependencies): Rename to prog_start_prerequisites
(register_prog0): Do not fill prereq. This will be done later,
when all dependencies are resolved.
(prog_rebuild_prerequisites): New function.
(prog_start): Per-component limitis override system-wide ones.
(component_fixup_depend, fixup_prerequisites)
(rebuild_prerequisites): New functions.
(progman_build_depmap): Call fixup_prerequisites and
rebuild_prerequisites.
(prog_stop_dependent): Rename to prog_stop_dependents.
* pies/meta1gram.y: Implement restart_dependencies.
* pies/pies.h (struct component): Rename "depend" to "prereq". Add
new member "depend".
(pies_limits): New extern.
Diffstat (limited to 'pies')
-rw-r--r-- | pies/meta1gram.y | 3 | ||||
-rw-r--r-- | pies/pies.c | 56 | ||||
-rw-r--r-- | pies/pies.h | 4 | ||||
-rw-r--r-- | pies/progman.c | 220 |
4 files changed, 158 insertions, 125 deletions
diff --git a/pies/meta1gram.y b/pies/meta1gram.y index 460916e..5a34309 100644 --- a/pies/meta1gram.y +++ b/pies/meta1gram.y @@ -319,8 +319,7 @@ static struct node_trans root_node_trans[] = { { "user", "user" }, { "path", "program" }, { "arguments", "command" }, - /* FIXME: */ - /* { "restart_dependencies", "depend", },*/ + { "restart_dependencies", "dependents", }, { NULL } }; diff --git a/pies/pies.c b/pies/pies.c index 7d70ebd..3412697 100644 --- a/pies/pies.c +++ b/pies/pies.c @@ -30,6 +30,7 @@ char *statfile = STATEDIR "/pies.stat"; mode_t pies_umask = 0; unsigned long shutdown_timeout = 5; mu_acl_t pies_acl; +limits_record_t pies_limits; /* Logging */ @@ -388,49 +389,6 @@ _cb_command (mu_debug_t debug, void *data, mu_config_value_t *val) } static int -_cb_depend (mu_debug_t debug, void *data, mu_config_value_t *val) -{ - char ***pargv = data; - char **argv; - size_t count; - mu_iterator_t itr; - - switch (val->type) - { - case MU_CFG_ARRAY: - argv = config_array_to_argv (val, debug); - break; - - case MU_CFG_STRING: - argv = xcalloc (2, sizeof (*argv)); - argv[0] = xstrdup (val->v.string); - argv[1] = NULL; - break; - - case MU_CFG_LIST: - mu_list_count (val->v.list, &count); - if (mu_list_get_iterator (val->v.list, &itr)) - return 1; - - argv = xcalloc (count + 1, sizeof (argv[0])); - - for (mu_iterator_first (itr), count = 0; - !mu_iterator_is_done (itr); mu_iterator_next (itr), count++) - { - mu_config_value_t *p; - mu_iterator_current (itr, (void**)&p); - if (mu_cfg_assert_value_type (p, MU_CFG_STRING, debug)) - return 1; - argv[count] = xstrdup (p->v.string); - } - mu_iterator_destroy (&itr); - break; - } - *pargv = argv; - return 0; -} - -static int _cb_umask (mu_debug_t debug, void *data, mu_config_value_t *arg) { mode_t *pmode = data; @@ -602,9 +560,13 @@ struct mu_cfg_param component_cfg_param[] = { { "command", mu_cfg_callback, NULL, mu_offsetof (struct component, argv), _cb_command, N_("Command line.") }, - { "depend", mu_cfg_callback, NULL, - mu_offsetof (struct component, depend), _cb_depend, - N_("List of dependenices (whitespace separated)"), + { "prerequisites", MU_CFG_LIST_OF(mu_cfg_string), NULL, + mu_offsetof (struct component, prereq), NULL, + N_("List of prerequisites."), + N_("list") }, + { "dependents", MU_CFG_LIST_OF(mu_cfg_string), NULL, + mu_offsetof (struct component, depend), NULL, + N_("List of components for which this one is a prerequisite."), N_("list") }, { "disable", mu_cfg_bool, NULL, mu_offsetof (struct component, disabled), NULL, @@ -820,6 +782,8 @@ struct mu_cfg_param pies_cfg_param[] = { { "umask", mu_cfg_callback, &pies_umask, 0, _cb_umask, N_("Force this umask."), N_("arg: number") }, + { "limits", mu_cfg_callback, &pies_limits, 0, _cb_limits, + N_("Set global system limits") }, { "shutdown-timeout", mu_cfg_uint, &shutdown_timeout, 0, NULL, N_("Wait <n> seconds for all components to shut down."), "n" }, diff --git a/pies/pies.h b/pies/pies.h index db0f4c7..3806f61 100644 --- a/pies/pies.h +++ b/pies/pies.h @@ -106,7 +106,8 @@ struct component char **argv; /* Program command line */ char **env; /* Program environment */ char *dir; /* Working directory */ - char **depend; /* Dependencies */ + mu_list_t prereq; /* Prerequisites */ + mu_list_t depend; /* Dependency targets */ /* FIXME: disabled and precios can be encoded as bits in mode */ int disabled; /* The componenet is disabled */ int precious; /* The component is precious (cannot be disabled) */ @@ -130,6 +131,7 @@ extern unsigned long shutdown_timeout; extern struct component default_component; extern mu_acl_t pies_acl; extern mu_debug_t pies_debug; +extern limits_record_t pies_limits; void register_prog (struct component *comp); size_t progman_running_count (void); diff --git a/pies/progman.c b/pies/progman.c index 8ed9733..6a1780e 100644 --- a/pies/progman.c +++ b/pies/progman.c @@ -37,7 +37,7 @@ struct prog pid_t pid; /* PID */ char *tag; /* Entry tag (for diagnostics purposes) */ int idx; /* Numeric identifier */ - char **depend; + char **prereq; int facility; union { @@ -117,7 +117,7 @@ prog_lookup_by_idx (unsigned idx) } static void prog_stop (struct prog *prog, int sig); -void prog_start_dependencies (struct prog *prog); +void prog_start_prerequisites (struct prog *prog); void link_prog (struct prog *pp, int prepend) @@ -187,9 +187,9 @@ register_retr (int type, struct prog *master) free (tag); pp->v.r.master = master; pp->idx = numprog++; - pp->depend = (char**)pstr; - pp->depend[0] = master->tag; - pp->depend[1] = NULL; + pp->prereq = (char**)pstr; + pp->prereq[0] = master->tag; + pp->prereq[1] = NULL; link_prog (pp, 1); } @@ -207,38 +207,10 @@ update_retr (int type, struct prog *master, pid_t pid) static struct prog * register_prog0 (struct component *comp) { - struct prog *p, *newp; + struct prog *newp; int i; - size_t size = 0; - int dep_all = 0; - int depc = 0; - if (comp->depend) - { - if (comp->depend[0] && comp->depend[1] == NULL) - { - if (strcmp (comp->depend[0], "all") == 0) - { - dep_all = 1; - for (p = proghead; p; p = p->next) - if (p->type == TYPE_COMPONENT) - depc++; - } - else if (strcmp (comp->depend[0], "none") == 0) - comp->depend = NULL; - } - - if (depc == 0 && comp->depend) - for (depc = 0; comp->depend[depc]; depc++) - ; - } - - if (depc) - size += sizeof (comp->depend[0]) * (depc + 1); - - size += sizeof (*newp); - - newp = xzalloc (size); + newp = xzalloc (sizeof (*newp)); newp->type = TYPE_COMPONENT; newp->tag = comp->tag; newp->pid = 0; @@ -256,33 +228,6 @@ register_prog0 (struct component *comp) for (i = 0; i <= MAX_RETURN_CODE; i++) if (!comp->act[i]) comp->act[i] = default_component.act[i]; - - - if (depc) - { - char *pstr = (char*) (newp + 1); - newp->depend = (char**) pstr; - pstr = (char*) (newp->depend + depc + 1); - - depc = 0; - if (comp->depend) - { - if (dep_all) - { - for (p = proghead; p; p = p->next) - if (p->type == TYPE_COMPONENT) - newp->depend[depc++] = p->tag; - } - else - { - for (; comp->depend[depc]; depc++) - newp->depend[depc] = comp->depend[depc]; - } - } - newp->depend[depc] = NULL; - } - else - newp->depend = NULL; if (comp->mode != pies_comp_exec) comp->retr[RETR_OUT] = -1; @@ -297,6 +242,64 @@ register_prog0 (struct component *comp) } void +prog_rebuild_prerequisites (struct prog *prog) +{ + struct component *comp = prog->v.p.comp; + struct prog *p; + int dep_all = 0; + size_t depc = 0; + + if (comp->prereq) + { + mu_list_count (comp->prereq, &depc); + if (depc == 1) + { + char *item; + mu_list_get (comp->prereq, 0, (void**)&item); + if (strcmp (item, "all") == 0) + { + dep_all = 1; + for (p = proghead; p; p = p->next) + if (p->type == TYPE_COMPONENT) + depc++; + } + else if (strcmp (item, "none") == 0) + mu_list_destroy (&comp->prereq); + } + } + + if (depc == 0) + return; + + prog->prereq = xcalloc (depc + 1, sizeof (prog->prereq[0])); + + depc = 0; + if (comp->prereq) + { + if (dep_all) + { + for (p = proghead; p; p = p->next) + if (p->type == TYPE_COMPONENT) + prog->prereq[depc++] = p->tag; + } + else + { + mu_iterator_t itr = NULL; + mu_list_get_iterator (comp->prereq, &itr); + for (mu_iterator_first (itr), depc = 0; + !mu_iterator_is_done (itr); mu_iterator_next (itr), depc++) + { + char *str; + mu_iterator_current (itr, (void**)&str); + prog->prereq[depc] = str; + } + mu_iterator_destroy (&itr); + } + } + prog->prereq[depc] = NULL; +} + +void register_prog (struct component *comp) { struct prog *prog = register_prog0 (comp); @@ -602,7 +605,7 @@ prog_start (struct prog *prog) return; } - prog_start_dependencies (prog); + prog_start_prerequisites (prog); if (prog->v.p.status == status_disabled) return; /* FIXME: other statuses */ MU_DEBUG1 (pies_debug, MU_DEBUG_TRACE1, _("starting %s\n"), prog->tag); @@ -645,7 +648,9 @@ prog_start (struct prog *prog) if (prog->v.p.comp->umask) umask (prog->v.p.comp->umask); - set_limits (prog->tag, prog->v.p.comp->limits); + set_limits (prog->tag, + prog->v.p.comp->limits ? + prog->v.p.comp->limits : pies_limits); if (mu_debug_check_level (pies_debug, MU_DEBUG_TRACE1)) { @@ -823,7 +828,66 @@ progman_accept (int socket) p->v.p.socket = -1; return 0; } + + +void +component_fixup_depend (struct component *comp) +{ + mu_iterator_t itr; + + if (comp->depend == NULL) + return; + + mu_list_get_iterator (comp->depend, &itr); + for (mu_iterator_first (itr); + !mu_iterator_is_done (itr); mu_iterator_next (itr)) + { + char *tag; + struct component *tgt; + + mu_iterator_current (itr, (void**)&tag); + tgt = progman_lookup_component (tag); + if (!tgt) + { + mu_error (_("component %s declares dependency target %s, " + "which is not declared"), + comp->tag, tag); + continue; + } + if (!tgt->prereq) + { + int rc = mu_list_create (&tgt->prereq); + if (rc) + { + mu_error (_("cannot create list: %s"), mu_strerror (rc)); + continue; + } + /* FIXME: memory allocation */ + mu_list_append (tgt->prereq, xstrdup (comp->tag)); + } + } + mu_list_destroy (&comp->depend); +} + +void +fixup_prerequisites () +{ + struct prog *prog; + for (prog = proghead; prog; prog = prog->next) + if (IS_PROG (prog)) + component_fixup_depend (prog->v.p.comp); +} + +void +rebuild_prerequisites () +{ + struct prog *prog; + for (prog = proghead; prog; prog = prog->next) + if (IS_PROG (prog)) + prog_rebuild_prerequisites (prog); +} + int progman_build_depmap () { @@ -832,19 +896,21 @@ progman_build_depmap () struct prog *prog; pies_depmap_t dp; + fixup_prerequisites (); + rebuild_prerequisites (); depmap = depmap_alloc (numprog); for (prog = proghead; prog; prog = prog->next) - if (prog->depend) + if (prog->prereq) { - for (i = 0; prog->depend[i]; i++) + for (i = 0; prog->prereq[i]; i++) { - struct prog *dep = prog_lookup_by_tag (prog->depend[i]); + struct prog *dep = prog_lookup_by_tag (prog->prereq[i]); if (!dep) { prog->v.p.status = status_disabled; mu_error (_("component %s depends on %s, " "which is not declared"), - prog->tag, prog->depend[i]); + prog->tag, prog->prereq[i]); rc++; } else @@ -865,6 +931,8 @@ progman_build_depmap () return rc; } + + void progman_start () { @@ -896,17 +964,17 @@ progman_wake_sleeping () } void -prog_start_dependencies (struct prog *prog) +prog_start_prerequisites (struct prog *prog) { int i; - if (!prog->depend) + if (!prog->prereq) return; MU_DEBUG1 (pies_debug, MU_DEBUG_TRACE1, "Starting dependencies of %s\n", prog->tag); - for (i = 0; prog->depend[i]; i++) + for (i = 0; prog->prereq[i]; i++) { - struct prog *dp = prog_lookup_by_tag (prog->depend[i]); + struct prog *dp = prog_lookup_by_tag (prog->prereq[i]); if (!IS_PROG (dp)) /* Skip retranslators */ continue; if (prog->v.p.comp->precious) @@ -923,12 +991,12 @@ prog_start_dependencies (struct prog *prog) break; } } - for (i = 0; prog->depend[i]; i++) - prog_start (prog_lookup_by_tag (prog->depend[i])); + for (i = 0; prog->prereq[i]; i++) + prog_start (prog_lookup_by_tag (prog->prereq[i])); } void -prog_stop_dependent (struct prog *prog) +prog_stop_dependents (struct prog *prog) { pies_depmap_pos_t pos; unsigned n; @@ -1175,7 +1243,7 @@ progman_cleanup (int expect_term) unlink_prog (prog); else { - prog_stop_dependent (prog); + prog_stop_dependents (prog); if (!expect_term) { if (WIFEXITED (status)) |