]> git.ipfire.org Git - people/ms/systemd.git/commitdiff
add new manager initializer callbacks to per-unit type vtable
authorLennart Poettering <lennart@poettering.net>
Thu, 28 Jan 2010 05:45:44 +0000 (06:45 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 28 Jan 2010 05:45:55 +0000 (06:45 +0100)
manager.c
unit.h

index 8ee560c5543f0eb570857b12ed4fa7edb1445a96..23d450d33fe71d236babd658cb912cb20da6844d 100644 (file)
--- 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 f9d96c7efcd9a2d7dd115c7c97f5ec5ddb1608fb..7ab2ccdfbcef004f7b9d0592094150cd2cda3c42 100644 (file)
--- 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];