X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Funit.h;h=34afe93e655bf98d6194f6c48b82f30083eaba9b;hp=c58202bf0f00cab81841114d1a8a2ffb7bc678bc;hb=7452394e2ecb1dc994c1e9215592bcef28681396;hpb=718db96199eb307751264e4163555662c9a389fa diff --git a/src/core/unit.h b/src/core/unit.h index c58202bf0..34afe93e6 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -106,6 +106,9 @@ enum UnitDependency { UNIT_PROPAGATES_RELOAD_TO, UNIT_RELOAD_PROPAGATED_FROM, + /* Joins namespace of */ + UNIT_JOINS_NAMESPACE_OF, + /* Reference information for GC logic */ UNIT_REFERENCES, /* Inverse of 'references' is 'referenced_by' */ UNIT_REFERENCED_BY, @@ -174,7 +177,9 @@ struct Unit { /* Counterparts in the cgroup filesystem */ char *cgroup_path; - CGroupControllerMask cgroup_mask; + CGroupControllerMask cgroup_realized_mask; + CGroupControllerMask cgroup_subtree_mask; + CGroupControllerMask cgroup_members_mask; UnitRef slice; @@ -199,6 +204,11 @@ struct Unit { /* CGroup realize members queue */ LIST_FIELDS(Unit, cgroup_queue); + /* PIDs we keep an eye on. Note that a unit might have many + * more, but these are the ones we care enough about to + * process SIGCHLD for */ + Set *pids; + /* Used during GC sweeps */ unsigned gc_marker; @@ -229,8 +239,8 @@ struct Unit { /* Allow isolation requests */ bool allow_isolate; - /* Isolate OnFailure unit */ - bool on_failure_isolate; + /* How to start OnFailure units */ + JobMode on_failure_job_mode; /* Ignore this unit when isolating */ bool ignore_on_isolate; @@ -257,6 +267,8 @@ struct Unit { bool in_audit:1; bool cgroup_realized:1; + bool cgroup_members_mask_valid:1; + bool cgroup_subtree_mask_valid:1; }; struct UnitStatusMessageFormats { @@ -272,14 +284,15 @@ typedef enum UnitSetPropertiesMode { } UnitSetPropertiesMode; #include "service.h" -#include "timer.h" #include "socket.h" +#include "busname.h" #include "target.h" +#include "snapshot.h" #include "device.h" #include "mount.h" #include "automount.h" -#include "snapshot.h" #include "swap.h" +#include "timer.h" #include "path.h" #include "slice.h" #include "scope.h" @@ -300,6 +313,11 @@ struct UnitVTable { * KillContext is found, if the unit type has that */ size_t kill_context_offset; + /* If greater than 0, the offset into the object where the + * pointer to ExecRuntime is found, if the unit type has + * that */ + size_t exec_runtime_offset; + /* The name of the configuration file section with the private settings of this unit*/ const char *private_section; @@ -400,6 +418,8 @@ struct UnitVTable { /* Called whenever CLOCK_REALTIME made a jump */ void (*time_change)(Unit *u); + int (*get_timeout)(Unit *u, uint64_t *timeout); + /* This is called for each unit type and should be used to * enumerate existing devices and load them. However, * everything that is loaded here should still stay in @@ -416,9 +436,6 @@ struct UnitVTable { /* The bus vtable */ const sd_bus_vtable *bus_vtable; - /* strv list of changing properties */ - const char * const * const bus_changing_properties; - /* The strings to print in status messages */ UnitStatusMessageFormats status_message_formats; @@ -453,15 +470,16 @@ extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX]; #define UNIT_TRIGGER(u) ((Unit*) set_first((u)->dependencies[UNIT_TRIGGERS])) -DEFINE_CAST(SOCKET, Socket); -DEFINE_CAST(TIMER, Timer); DEFINE_CAST(SERVICE, Service); +DEFINE_CAST(SOCKET, Socket); +DEFINE_CAST(BUSNAME, BusName); DEFINE_CAST(TARGET, Target); +DEFINE_CAST(SNAPSHOT, Snapshot); DEFINE_CAST(DEVICE, Device); DEFINE_CAST(MOUNT, Mount); DEFINE_CAST(AUTOMOUNT, Automount); -DEFINE_CAST(SNAPSHOT, Snapshot); DEFINE_CAST(SWAP, Swap); +DEFINE_CAST(TIMER, Timer); DEFINE_CAST(PATH, Path); DEFINE_CAST(SLICE, Slice); DEFINE_CAST(SCOPE, Scope); @@ -528,6 +546,10 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su int unit_watch_pid(Unit *u, pid_t pid); void unit_unwatch_pid(Unit *u, pid_t pid); +int unit_watch_all_pids(Unit *u); +void unit_unwatch_all_pids(Unit *u); + +void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2); int unit_watch_bus_name(Unit *u, const char *name); void unit_unwatch_bus_name(Unit *u, const char *name); @@ -557,6 +579,7 @@ bool unit_need_daemon_reload(Unit *u); void unit_reset_failed(Unit *u); Unit *unit_following(Unit *u); +int unit_following_set(Unit *u, Set **s); const char *unit_slice_name(Unit *u); @@ -568,8 +591,6 @@ int unit_add_default_target_dependency(Unit *u, Unit *target); char *unit_default_cgroup_path(Unit *u); -int unit_following_set(Unit *u, Set **s); - void unit_start_on_failure(Unit *u); void unit_trigger_notify(Unit *u); @@ -581,11 +602,15 @@ void unit_ref_unset(UnitRef *ref); #define UNIT_DEREF(ref) ((ref).unit) #define UNIT_ISSET(ref) (!!(ref).unit) -int unit_exec_context_defaults(Unit *u, ExecContext *c); +int unit_exec_context_patch_defaults(Unit *u, ExecContext *c); +int unit_cgroup_context_init_defaults(Unit *u, CGroupContext *c); ExecContext *unit_get_exec_context(Unit *u) _pure_; KillContext *unit_get_kill_context(Unit *u) _pure_; CGroupContext *unit_get_cgroup_context(Unit *u) _pure_; +ExecRuntime *unit_get_exec_runtime(Unit *u) _pure_; + +int unit_setup_exec_runtime(Unit *u); int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data); int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);