X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Funit.h;h=11242c2a001c54050bb0e0968c6152819d432214;hb=340a1d2330ddc1dd18ad75bcdddf32f63c84b4a1;hp=ac5647a7f2677d55e8e98a87859b9eb328136efd;hpb=5ad096b3f1331b175340129a8c9a5a9d711e5415;p=elogind.git diff --git a/src/core/unit.h b/src/core/unit.h index ac5647a7f..11242c2a0 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -301,8 +301,14 @@ struct UnitVTable { int (*load)(Unit *u); /* If a lot of units got created via enumerate(), this is - * where to actually set the state and call unit_notify(). */ - int (*coldplug)(Unit *u); + * where to actually set the state and call unit_notify(). + * + * This must not reference other units (maybe implicitly through spawning + * jobs), because it is possible that they are not yet coldplugged. + * Such actions must be deferred until the end of coldplug bу adding + * a "Unit* -> int(*)(Unit*)" entry into the hashmap. + */ + int (*coldplug)(Unit *u, Hashmap *deferred_work); void (*dump)(Unit *u, FILE *f, const char *prefix); @@ -538,7 +544,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds); int unit_add_node_link(Unit *u, const char *what, bool wants); -int unit_coldplug(Unit *u); +int unit_coldplug(Unit *u, Hashmap *deferred_work); void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_(3, 0);