diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-02-06 17:17:51 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-02-07 15:14:36 +0100 |
commit | a911bb9ab27ac0eb3bbf4e8b4109e5da9b88eee3 (patch) | |
tree | 55b6b9de8c3ca096208b76ca113aa849119becb5 /src/core/dbus-scope.c | |
parent | 1006a62d20855eb7d70b044031a2a676a8111a0f (diff) |
core: watch SIGCHLD more closely to track processes of units with no reliable cgroup empty notifier
When a process dies that we can associate with a specific unit, start
watching all other processes of that unit, so that we can associate
those processes with the unit too.
Also, for service units start doing this as soon as we get the first
SIGCHLD for either control or main process, so that we can follow the
processes of the service from one to the other, as long as process that
remain are processes of the ones we watched that died and got reassigned
to us as parent.
Similar, for scope units start doing this as soon as the scope
controller abandons the unit, and thus management entirely reverts to
systemd. To abandon a unit introduce a new Abandon() scope unit method
call.
Diffstat (limited to 'src/core/dbus-scope.c')
-rw-r--r-- | src/core/dbus-scope.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/core/dbus-scope.c b/src/core/dbus-scope.c index d5a2048516..c46c972c26 100644 --- a/src/core/dbus-scope.c +++ b/src/core/dbus-scope.c @@ -28,6 +28,16 @@ #include "bus-util.h" #include "bus-internal.h" +static int bus_scope_abandon(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { + Scope *s = userdata; + + assert(bus); + assert(message); + assert(s); + + return scope_abandon(s); +} + static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, scope_result, ScopeResult); const sd_bus_vtable bus_scope_vtable[] = { @@ -36,6 +46,7 @@ const sd_bus_vtable bus_scope_vtable[] = { SD_BUS_PROPERTY("TimeoutStopUSec", "t", bus_property_get_usec, offsetof(Scope, timeout_stop_usec), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Scope, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_SIGNAL("RequestStop", NULL, 0), + SD_BUS_METHOD("Abandon", NULL, NULL, bus_scope_abandon, 0), SD_BUS_VTABLE_END }; @@ -56,10 +67,6 @@ static int bus_scope_set_transient_property( unsigned n = 0; uint32_t pid; - r = set_ensure_allocated(&s->pids, trivial_hash_func, trivial_compare_func); - if (r < 0) - return r; - r = sd_bus_message_enter_container(message, 'a', "u"); if (r < 0) return r; @@ -70,7 +77,7 @@ static int bus_scope_set_transient_property( return -EINVAL; if (mode != UNIT_CHECK) { - r = set_put(s->pids, LONG_TO_PTR(pid)); + r = unit_watch_pid(UNIT(s), pid); if (r < 0 && r != -EEXIST) return r; } |