m->manager->host_machine = NULL;
}
+ m->leader_pidfd_event_source = sd_event_source_disable_unref(m->leader_pidfd_event_source);
if (pidref_is_set(&m->leader)) {
if (m->manager)
(void) hashmap_remove_value(m->manager->machine_leaders, PID_TO_PTR(m->leader.pid), m);
return 0;
}
+static int machine_dispatch_leader_pidfd(sd_event_source *s, int fd, unsigned revents, void *userdata) {
+ Machine *m = ASSERT_PTR(userdata);
+
+ m->leader_pidfd_event_source = sd_event_source_disable_unref(m->leader_pidfd_event_source);
+ machine_add_to_gc_queue(m);
+
+ return 0;
+}
+
+static int machine_watch_pidfd(Machine *m) {
+ int r;
+
+ assert(m);
+ assert(m->manager);
+ assert(pidref_is_set(&m->leader));
+ assert(!m->leader_pidfd_event_source);
+
+ if (m->leader.fd < 0)
+ return 0;
+
+ /* If we have a pidfd for the leader, let's also track it for POLLIN, and GC the machine
+ * automatically if it dies */
+
+ r = sd_event_add_io(m->manager->event, &m->leader_pidfd_event_source, m->leader.fd, EPOLLIN, machine_dispatch_leader_pidfd, m);
+ if (r < 0)
+ return r;
+
+ (void) sd_event_source_set_description(m->leader_pidfd_event_source, "machine-pidfd");
+
+ return 0;
+}
+
int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error) {
int r;
if (r < 0)
return r;
+ r = machine_watch_pidfd(m);
+ if (r < 0)
+ return r;
+
/* Create cgroup */
r = machine_ensure_scope(m, properties, error);
if (r < 0)