static void scope_done(Unit *u) { Scope *s = SCOPE(u); assert(u); s->controller = mfree(s->controller); s->controller_track = sd_bus_track_unref(s->controller_track); s->timer_event_source = sd_event_source_unref(s->timer_event_source); }
static int on_controller_gone(sd_bus_track *track, void *userdata) { Scope *s = userdata; assert(track); if (s->controller) { log_unit_debug(UNIT(s), "Controller %s disappeared from bus.", s->controller); unit_add_to_dbus_queue(UNIT(s)); s->controller = mfree(s->controller); } s->controller_track = sd_bus_track_unref(s->controller_track); return 0; }
void bus_track_dispatch(sd_bus_track *track) { int r; assert(track); assert(track->in_queue); assert(track->handler); bus_track_remove_from_queue(track); sd_bus_track_ref(track); r = track->handler(track, track->userdata); if (r < 0) log_debug_errno(r, "Failed to process track handler: %m"); else if (r == 0) bus_track_add_to_queue(track); sd_bus_track_unref(track); }
int bus_scope_track_controller(Scope *s) { int r; assert(s); if (!s->controller || s->controller_track) return 0; r = sd_bus_track_new(UNIT(s)->manager->api_bus, &s->controller_track, on_controller_gone, s); if (r < 0) return r; r = sd_bus_track_add_name(s->controller_track, s->controller); if (r < 0) { s->controller_track = sd_bus_track_unref(s->controller_track); return r; } return 0; }
int scope_abandon(Scope *s) { assert(s); if (unit_has_name(UNIT(s), SPECIAL_INIT_SCOPE)) return -EPERM; if (!IN_SET(s->state, SCOPE_RUNNING, SCOPE_ABANDONED)) return -ESTALE; s->was_abandoned = true; s->controller = mfree(s->controller); s->controller_track = sd_bus_track_unref(s->controller_track); scope_set_state(s, SCOPE_ABANDONED); /* The client is no longer watching the remaining processes, so let's step in here, under the assumption that * the remaining processes will be sooner or later reassigned to us as parent. */ (void) unit_enqueue_rewatch_pids(UNIT(s)); return 0; }