X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Funit.h;h=11242c2a001c54050bb0e0968c6152819d432214;hb=f5b51ea7fcb0b6380c3ceb4d4f3f22f647c6fd32;hp=b3775d4d897849e25a40aa58712f36271c7042c5;hpb=2eec67acbb00593e414549a7e5b35eb7dd776b1b;p=elogind.git diff --git a/src/core/unit.h b/src/core/unit.h index b3775d4d8..11242c2a0 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -176,6 +176,9 @@ struct Unit { UnitFileState unit_file_state; int unit_file_preset; + /* Where the cpuacct.usage cgroup counter was at the time the unit was started */ + nsec_t cpuacct_usage_base; + /* Counterparts in the cgroup filesystem */ char *cgroup_path; CGroupControllerMask cgroup_realized_mask; @@ -298,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); @@ -535,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);