summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--manager.c24
-rw-r--r--unit.h3
2 files changed, 26 insertions, 1 deletions
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];