From: Lennart Poettering Date: Thu, 28 Jan 2010 05:45:44 +0000 (+0100) Subject: add new manager initializer callbacks to per-unit type vtable X-Git-Tag: 0.git+20100605+dfd8ee-1~362 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7824bbebe329eea611b809e2fff3e6df4073a465;p=systemd add new manager initializer callbacks to per-unit type vtable --- diff --git a/manager.c b/manager.c index 8ee560c5..23d450d3 100644 --- a/manager.c +++ b/manager.c @@ -71,7 +71,21 @@ static int manager_load_special_units(Manager *m) { return r; return 0; -}; +} + +static int manager_enumerate(Manager *m) { + int r; + UnitType c; + + assert(m); + + for (c = 0; c < _UNIT_TYPE_MAX; c++) + if (unit_vtable[c]->enumerate) + if ((r = unit_vtable[c]->enumerate(m)) < 0) + return r; + + return 0; +} Manager* manager_new(void) { Manager *m; @@ -102,6 +116,9 @@ Manager* manager_new(void) { if (manager_load_special_units(m) < 0) goto fail; + if (manager_enumerate(m) < 0) + goto fail; + return m; fail: @@ -110,6 +127,7 @@ fail: } void manager_free(Manager *m) { + UnitType c; Unit *u; Job *j; @@ -121,6 +139,10 @@ void manager_free(Manager *m) { while ((u = hashmap_first(m->units))) unit_free(u); + for (c = 0; c < _UNIT_TYPE_MAX; c++) + if (unit_vtable[c]->shutdown) + unit_vtable[c]->shutdown(m); + hashmap_free(m->units); hashmap_free(m->jobs); hashmap_free(m->transaction_jobs); diff --git a/unit.h b/unit.h index f9d96c7e..7ab2ccdf 100644 --- a/unit.h +++ b/unit.h @@ -160,6 +160,9 @@ struct UnitVTable { void (*fd_event)(Unit *u, int fd, uint32_t events, Watch *w); void (*sigchld_event)(Unit *u, pid_t pid, int code, int status); void (*timer_event)(Unit *u, uint64_t n_elapsed, Watch *w); + + int (*enumerate)(Manager *m); + void (*shutdown)(Manager *m); }; extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];