dcavalca / rpms / systemd

Forked from rpms/systemd 2 years ago
Clone
Zbigniew Jędrzejewski-Szmek 4f9456
From ba421b96a473a4e608c2b1d01d3bb3dfe36c23a6 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 4f9456
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek 4f9456
Date: Thu, 6 Mar 2014 02:19:42 +0100
Zbigniew Jędrzejewski-Szmek 4f9456
Subject: [PATCH] core: correctly unregister PIDs from PID hashtables
Zbigniew Jędrzejewski-Szmek 4f9456
Zbigniew Jędrzejewski-Szmek 4f9456
Conflicts:
Zbigniew Jędrzejewski-Szmek 4f9456
	src/core/unit.c
Zbigniew Jędrzejewski-Szmek 4f9456
---
Zbigniew Jędrzejewski-Szmek 4f9456
 src/core/unit.c | 41 ++++++++++++++++++-----------------------
Zbigniew Jędrzejewski-Szmek 4f9456
 1 file changed, 18 insertions(+), 23 deletions(-)
Zbigniew Jędrzejewski-Szmek 4f9456
Zbigniew Jędrzejewski-Szmek 4f9456
diff --git a/src/core/unit.c b/src/core/unit.c
Zbigniew Jędrzejewski-Szmek 4f9456
index dc88862..9a7720d 100644
Zbigniew Jędrzejewski-Szmek 4f9456
--- a/src/core/unit.c
Zbigniew Jędrzejewski-Szmek 4f9456
+++ b/src/core/unit.c
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -1666,11 +1666,11 @@ int unit_watch_pid(Unit *u, pid_t pid) {
Zbigniew Jędrzejewski-Szmek 4f9456
         /* Watch a specific PID. We only support one or two units
Zbigniew Jędrzejewski-Szmek 4f9456
          * watching each PID for now, not more. */
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-        r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
Zbigniew Jędrzejewski-Szmek 4f9456
+        r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
Zbigniew Jędrzejewski-Szmek 4f9456
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 4f9456
                 return r;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-        r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
Zbigniew Jędrzejewski-Szmek 4f9456
+        r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
Zbigniew Jędrzejewski-Szmek 4f9456
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 4f9456
                 return r;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -1699,7 +1699,17 @@ void unit_unwatch_pid(Unit *u, pid_t pid) {
Zbigniew Jędrzejewski-Szmek 4f9456
         set_remove(u->pids, LONG_TO_PTR(pid));
Zbigniew Jędrzejewski-Szmek 4f9456
 }
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-static int watch_pids_in_path(Unit *u, const char *path) {
Zbigniew Jędrzejewski-Szmek 4f9456
+void unit_unwatch_all_pids(Unit *u) {
Zbigniew Jędrzejewski-Szmek 4f9456
+        assert(u);
Zbigniew Jędrzejewski-Szmek 4f9456
+
Zbigniew Jędrzejewski-Szmek 4f9456
+        while (!set_isempty(u->pids))
Zbigniew Jędrzejewski-Szmek 4f9456
+                unit_unwatch_pid(u, PTR_TO_LONG(set_first(u->pids)));
Zbigniew Jędrzejewski-Szmek 4f9456
+
Zbigniew Jędrzejewski-Szmek 4f9456
+        set_free(u->pids);
Zbigniew Jędrzejewski-Szmek 4f9456
+        u->pids = NULL;
Zbigniew Jędrzejewski-Szmek 4f9456
+}
Zbigniew Jędrzejewski-Szmek 4f9456
+
Zbigniew Jędrzejewski-Szmek 4f9456
+static int unit_watch_pids_in_path(Unit *u, const char *path) {
Zbigniew Jędrzejewski-Szmek 4f9456
         _cleanup_closedir_ DIR *d = NULL;
Zbigniew Jędrzejewski-Szmek 4f9456
         _cleanup_fclose_ FILE *f = NULL;
Zbigniew Jędrzejewski-Szmek 4f9456
         int ret = 0, r;
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -1737,7 +1747,7 @@ static int watch_pids_in_path(Unit *u, const char *path) {
Zbigniew Jędrzejewski-Szmek 4f9456
                         if (!p)
Zbigniew Jędrzejewski-Szmek 4f9456
                                 return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-                        r = watch_pids_in_path(u, p);
Zbigniew Jędrzejewski-Szmek 4f9456
+                        r = unit_watch_pids_in_path(u, p);
Zbigniew Jędrzejewski-Szmek 4f9456
                         if (r < 0 && ret >= 0)
Zbigniew Jędrzejewski-Szmek 4f9456
                                 ret = r;
Zbigniew Jędrzejewski-Szmek 4f9456
                 }
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -1754,27 +1764,12 @@ static int watch_pids_in_path(Unit *u, const char *path) {
Zbigniew Jędrzejewski-Szmek 4f9456
 int unit_watch_all_pids(Unit *u) {
Zbigniew Jędrzejewski-Szmek 4f9456
         assert(u);
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-        if (!u->cgroup_path)
Zbigniew Jędrzejewski-Szmek 4f9456
-                return -ENOENT;
Zbigniew Jędrzejewski-Szmek 4f9456
-
Zbigniew Jędrzejewski-Szmek 4f9456
         /* Adds all PIDs from our cgroup to the set of PIDs we watch */
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-        return watch_pids_in_path(u, u->cgroup_path);
Zbigniew Jędrzejewski-Szmek 4f9456
-}
Zbigniew Jędrzejewski-Szmek 4f9456
-
Zbigniew Jędrzejewski-Szmek 4f9456
-void unit_unwatch_all_pids(Unit *u) {
Zbigniew Jędrzejewski-Szmek 4f9456
-        Iterator i;
Zbigniew Jędrzejewski-Szmek 4f9456
-        void *e;
Zbigniew Jędrzejewski-Szmek 4f9456
-
Zbigniew Jędrzejewski-Szmek 4f9456
-        assert(u);
Zbigniew Jędrzejewski-Szmek 4f9456
-
Zbigniew Jędrzejewski-Szmek 4f9456
-        SET_FOREACH(e, u->pids, i) {
Zbigniew Jędrzejewski-Szmek 4f9456
-                hashmap_remove_value(u->manager->watch_pids1, e, u);
Zbigniew Jędrzejewski-Szmek 4f9456
-                hashmap_remove_value(u->manager->watch_pids2, e, u);
Zbigniew Jędrzejewski-Szmek 4f9456
-        }
Zbigniew Jędrzejewski-Szmek 4f9456
+        if (!u->cgroup_path)
Zbigniew Jędrzejewski-Szmek 4f9456
+                return -ENOENT;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
-        set_free(u->pids);
Zbigniew Jędrzejewski-Szmek 4f9456
-        u->pids = NULL;
Zbigniew Jędrzejewski-Szmek 4f9456
+        return unit_watch_pids_in_path(u, u->cgroup_path);
Zbigniew Jędrzejewski-Szmek 4f9456
 }
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
 void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
Zbigniew Jędrzejewski-Szmek 4f9456
@@ -1792,7 +1787,7 @@ void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
Zbigniew Jędrzejewski-Szmek 4f9456
                         continue;
Zbigniew Jędrzejewski-Szmek 4f9456
 
Zbigniew Jędrzejewski-Szmek 4f9456
                 if (kill(pid, 0) < 0 && errno == ESRCH)
Zbigniew Jędrzejewski-Szmek 4f9456
-                        set_remove(u->pids, e);
Zbigniew Jędrzejewski-Szmek 4f9456
+                        unit_unwatch_pid(u, pid);
Zbigniew Jędrzejewski-Szmek 4f9456
         }
Zbigniew Jędrzejewski-Szmek 4f9456
 }
Zbigniew Jędrzejewski-Szmek 4f9456