aboutsummaryrefslogtreecommitdiff
path: root/pies
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2008-11-12 18:10:09 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2008-11-12 18:10:09 +0000
commit27f32531cccac2b4745a63506a3a363a4e82f633 (patch)
tree38d87eadb63ffd8e849bf4675c76a8a73b846a17 /pies
parent378f6d3a07bc1deb56160a464786a43b1c1907ac (diff)
downloadpies-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.y3
-rw-r--r--pies/pies.c56
-rw-r--r--pies/pies.h4
-rw-r--r--pies/progman.c220
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))

Return to:

Send suggestions and report system problems to the System administrator.