|
Zbigniew Jędrzejewski-Szmek |
96237b |
From dd935122a989eeb31a0ab4d42ad5381f1f48446e Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
From: Lennart Poettering <lennart@poettering.net>
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
Date: Thu, 6 Mar 2014 02:19:42 +0100
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
Subject: [PATCH] core: correctly unregister PIDs from PID hashtables
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
(cherry picked from commit bd44e61b0480712ec5585ff7b0295362a5f9dd36)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
---
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
src/core/unit.c | 42 ++++++++++++++++++------------------------
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
1 file changed, 18 insertions(+), 24 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
diff --git a/src/core/unit.c b/src/core/unit.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
index 1bbcb39..5a5592c 100644
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
--- a/src/core/unit.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+++ b/src/core/unit.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -1703,11 +1703,11 @@ int unit_watch_pid(Unit *u, pid_t pid) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
/* Watch a specific PID. We only support one or two units
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
* watching each PID for now, not more. */
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -1736,7 +1736,17 @@ void unit_unwatch_pid(Unit *u, pid_t pid) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
set_remove(u->pids, LONG_TO_PTR(pid));
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
-static int watch_pids_in_path(Unit *u, const char *path) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+void unit_unwatch_all_pids(Unit *u) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert(u);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ while (!set_isempty(u->pids))
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ unit_unwatch_pid(u, PTR_TO_LONG(set_first(u->pids)));
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ set_free(u->pids);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ u->pids = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+static int unit_watch_pids_in_path(Unit *u, const char *path) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
_cleanup_closedir_ DIR *d = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
_cleanup_fclose_ FILE *f = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
int ret = 0, r;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -1774,7 +1784,7 @@ static int watch_pids_in_path(Unit *u, const char *path) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
if (!p)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
return -ENOMEM;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- r = watch_pids_in_path(u, p);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ r = unit_watch_pids_in_path(u, p);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
if (r < 0 && ret >= 0)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
ret = r;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -1787,31 +1797,15 @@ static int watch_pids_in_path(Unit *u, const char *path) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
return ret;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
-
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
int unit_watch_all_pids(Unit *u) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert(u);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- if (!u->cgroup_path)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- return -ENOENT;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
-
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
/* Adds all PIDs from our cgroup to the set of PIDs we watch */
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- return watch_pids_in_path(u, u->cgroup_path);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
-}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
-
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
-void unit_unwatch_all_pids(Unit *u) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- Iterator i;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- void *e;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
-
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- assert(u);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
-
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- SET_FOREACH(e, u->pids, i) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- hashmap_remove_value(u->manager->watch_pids1, e, u);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- hashmap_remove_value(u->manager->watch_pids2, e, u);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ if (!u->cgroup_path)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ return -ENOENT;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- set_free(u->pids);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- u->pids = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ return unit_watch_pids_in_path(u, u->cgroup_path);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -1829,7 +1823,7 @@ void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
continue;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
if (!pid_is_unwaited(pid))
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- set_remove(u->pids, e);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ unit_unwatch_pid(u, pid);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|