summaryrefslogtreecommitdiff
path: root/core/systemd/0017-core-correctly-unregister-PIDs-from-PID-hashtables.patch
diff options
context:
space:
mode:
Diffstat (limited to 'core/systemd/0017-core-correctly-unregister-PIDs-from-PID-hashtables.patch')
-rw-r--r--core/systemd/0017-core-correctly-unregister-PIDs-from-PID-hashtables.patch102
1 files changed, 102 insertions, 0 deletions
diff --git a/core/systemd/0017-core-correctly-unregister-PIDs-from-PID-hashtables.patch b/core/systemd/0017-core-correctly-unregister-PIDs-from-PID-hashtables.patch
new file mode 100644
index 000000000..209a3fb75
--- /dev/null
+++ b/core/systemd/0017-core-correctly-unregister-PIDs-from-PID-hashtables.patch
@@ -0,0 +1,102 @@
+From bd44e61b0480712ec5585ff7b0295362a5f9dd36 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart@poettering.net>
+Date: Thu, 6 Mar 2014 02:19:42 +0100
+Subject: [PATCH] core: correctly unregister PIDs from PID hashtables
+
+---
+ src/core/unit.c | 42 ++++++++++++++++++------------------------
+ 1 file changed, 18 insertions(+), 24 deletions(-)
+
+diff --git a/src/core/unit.c b/src/core/unit.c
+index 2437ee3..85250ca 100644
+--- a/src/core/unit.c
++++ b/src/core/unit.c
+@@ -1704,11 +1704,11 @@ int unit_watch_pid(Unit *u, pid_t pid) {
+ /* 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);
++ r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
+ if (r < 0)
+ return r;
+
+- r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
++ r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
+ if (r < 0)
+ return r;
+
+@@ -1737,7 +1737,17 @@ void unit_unwatch_pid(Unit *u, pid_t pid) {
+ set_remove(u->pids, LONG_TO_PTR(pid));
+ }
+
+-static int watch_pids_in_path(Unit *u, const char *path) {
++void unit_unwatch_all_pids(Unit *u) {
++ assert(u);
++
++ while (!set_isempty(u->pids))
++ unit_unwatch_pid(u, PTR_TO_LONG(set_first(u->pids)));
++
++ set_free(u->pids);
++ u->pids = NULL;
++}
++
++static int unit_watch_pids_in_path(Unit *u, const char *path) {
+ _cleanup_closedir_ DIR *d = NULL;
+ _cleanup_fclose_ FILE *f = NULL;
+ int ret = 0, r;
+@@ -1775,7 +1785,7 @@ static int watch_pids_in_path(Unit *u, const char *path) {
+ if (!p)
+ return -ENOMEM;
+
+- r = watch_pids_in_path(u, p);
++ r = unit_watch_pids_in_path(u, p);
+ if (r < 0 && ret >= 0)
+ ret = r;
+ }
+@@ -1788,31 +1798,15 @@ static int watch_pids_in_path(Unit *u, const char *path) {
+ return ret;
+ }
+
+-
+ int unit_watch_all_pids(Unit *u) {
+ assert(u);
+
+- if (!u->cgroup_path)
+- return -ENOENT;
+-
+ /* Adds all PIDs from our cgroup to the set of PIDs we watch */
+
+- return watch_pids_in_path(u, u->cgroup_path);
+-}
+-
+-void unit_unwatch_all_pids(Unit *u) {
+- Iterator i;
+- void *e;
+-
+- assert(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);
+- }
++ if (!u->cgroup_path)
++ return -ENOENT;
+
+- set_free(u->pids);
+- u->pids = NULL;
++ return unit_watch_pids_in_path(u, u->cgroup_path);
+ }
+
+ void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
+@@ -1830,7 +1824,7 @@ void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
+ continue;
+
+ if (!pid_is_unwaited(pid))
+- set_remove(u->pids, e);
++ unit_unwatch_pid(u, pid);
+ }
+ }
+
+--
+1.9.0
+