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;
if (manager_load_special_units(m) < 0)
goto fail;
+ if (manager_enumerate(m) < 0)
+ goto fail;
+
return m;
fail:
}
void manager_free(Manager *m) {
+ UnitType c;
Unit *u;
Job *j;
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);
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];