diff --git a/manager.c b/manager.c index 8ee560c554..23d450d33f 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 f9d96c7efc..7ab2ccdfbc 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];