assert(u);
assert(pid >= 1);
+ /* Watch a specific PID. We only support one or two units
+ * watching each PID for now, not more. */
+
+ r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
+ if (r < 0)
+ return r;
+
r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
if (r < 0)
return r;
- /* Watch a specific PID. We only support one unit watching
- * each PID for now. */
+ r = hashmap_put(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
+ if (r == -EEXIST) {
+ r = hashmap_ensure_allocated(&u->manager->watch_pids2, trivial_hash_func, trivial_compare_func);
+ if (r < 0)
+ return r;
- r = set_put(u->pids, LONG_TO_PTR(pid));
+ r = hashmap_put(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
+ }
- q = hashmap_put(u->manager->watch_pids, LONG_TO_PTR(pid), u);
+ q = set_put(u->pids, LONG_TO_PTR(pid));
if (q < 0)
return q;
assert(u);
assert(pid >= 1);
- hashmap_remove_value(u->manager->watch_pids, LONG_TO_PTR(pid), u);
+ hashmap_remove_value(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
+ hashmap_remove_value(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
set_remove(u->pids, LONG_TO_PTR(pid));
}
assert(u);
- SET_FOREACH(e, u->pids, i)
- hashmap_remove_value(u->manager->watch_pids, e, u);
+ SET_FOREACH(e, u->pids, i) {
+ hashmap_remove_value(u->manager->watch_pids1, e, u);
+ hashmap_remove_value(u->manager->watch_pids2, e, u);
+ }
set_free(u->pids);
u->pids = NULL;
log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
} else if (r > 0) {
- wait_for_exit = true;
+ /* FIXME: For now, we will not wait for the
+ * cgroup members to die, simply because
+ * cgroup notification is unreliable. It
+ * doesn't work at all in containers, and
+ * outside of containers it can be confused
+ * easily by leaving directories in the
+ * cgroup. */
+
+ /* wait_for_exit = true; */
if (c->send_sighup && !sigkill) {
set_free(pid_set);