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=1b13ca826651fcc24c696c57af74a880d48fa125;hpb=b2dc4e44c540a30c5ea12a9a570425ceb310c320;p=elogind.git diff --git a/src/core/unit.h b/src/core/unit.h index 1b13ca826..11242c2a0 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -31,13 +31,7 @@ typedef enum UnitActiveState UnitActiveState; typedef struct UnitRef UnitRef; typedef struct UnitStatusMessageFormats UnitStatusMessageFormats; -#include "sd-event.h" -#include "set.h" -#include "util.h" #include "list.h" -#include "socket-util.h" -#include "execute.h" -#include "cgroup.h" #include "condition.h" #include "install.h" #include "unit-name.h" @@ -76,7 +70,6 @@ static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) { return t == UNIT_INACTIVE || t == UNIT_FAILED; } -#include "manager.h" #include "job.h" struct UnitRef { @@ -179,8 +172,12 @@ struct Unit { /* Error code when we didn't manage to load the unit (negative) */ int load_error; - /* Cached unit file state */ + /* Cached unit file state and preset */ 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; @@ -248,18 +245,16 @@ typedef enum UnitSetPropertiesMode { UNIT_PERSISTENT = 2, } UnitSetPropertiesMode; -#include "service.h" #include "socket.h" #include "busname.h" #include "target.h" #include "snapshot.h" #include "device.h" -#include "mount.h" #include "automount.h" #include "swap.h" #include "timer.h" -#include "path.h" #include "slice.h" +#include "path.h" #include "scope.h" struct UnitVTable { @@ -283,7 +278,7 @@ struct UnitVTable { * that */ size_t exec_runtime_offset; - /* The name of the configuration file section with the private settings of this unit*/ + /* The name of the configuration file section with the private settings of this unit */ const char *private_section; /* Config file sections this unit type understands, separated @@ -306,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); @@ -344,6 +345,10 @@ struct UnitVTable { * way */ bool (*check_gc)(Unit *u); + /* When the unit is not running and no job for it queued we + * shall release its runtime resources */ + void (*release_resources)(Unit *u); + /* Return true when this unit is suitable for snapshotting */ bool (*check_snapshot)(Unit *u); @@ -358,7 +363,7 @@ struct UnitVTable { void (*notify_cgroup_empty)(Unit *u); /* Called whenever a process of this unit sends us a message */ - void (*notify_message)(Unit *u, pid_t pid, char **tags); + void (*notify_message)(Unit *u, pid_t pid, char **tags, FDSet *fds); /* Called whenever a name this Unit registered for comes or * goes away. */ @@ -395,6 +400,10 @@ struct UnitVTable { /* Type specific cleanups. */ void (*shutdown)(Manager *m); + /* If this function is set and return false all jobs for units + * of this type will immediately fail. */ + bool (*supported)(Manager *m); + /* The interface name */ const char *bus_interface; @@ -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); @@ -560,6 +569,7 @@ void unit_start_on_failure(Unit *u); void unit_trigger_notify(Unit *u); UnitFileState unit_get_unit_file_state(Unit *u); +int unit_get_unit_file_preset(Unit *u); Unit* unit_ref_set(UnitRef *ref, Unit *u); void unit_ref_unset(UnitRef *ref);