summaryrefslogtreecommitdiff
path: root/src/cgroup.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-10-27 03:16:49 +0200
committerLennart Poettering <lennart@poettering.net>2010-10-27 03:16:49 +0200
commit4fbf50b38e847aaa2932ac542e20c62f0c1605a3 (patch)
tree821c1cbd6d883b277940d5eb8db64d2365132bd9 /src/cgroup.c
parent10717a1a8d48e50463abf2f6b47e2618eaa529e7 (diff)
service: when after startup only one process is in a service's cgroup, assume it is the main process
Diffstat (limited to 'src/cgroup.c')
-rw-r--r--src/cgroup.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/cgroup.c b/src/cgroup.c
index d64ab63bea..8b2ad5b0e9 100644
--- a/src/cgroup.c
+++ b/src/cgroup.c
@@ -397,3 +397,54 @@ char *cgroup_bonding_to_string(CGroupBonding *b) {
return r;
}
+
+pid_t cgroup_bonding_search_main_pid(CGroupBonding *b) {
+ FILE *f;
+ pid_t pid = 0, npid;
+ int r;
+
+ assert(b);
+
+ if (!b->only_us)
+ return 0;
+
+ if ((r = cg_enumerate_processes(b->controller, b->path, &f)) < 0)
+ return 0;
+
+ while ((r = cg_read_pid(f, &npid)) > 0) {
+
+ if (npid == pid)
+ continue;
+
+ if (pid != 0) {
+ /* Dang, there's more than one PID in this
+ * group, so we don't know what process is the
+ * main process. */
+ pid = 0;
+ break;
+ }
+
+ pid = npid;
+ }
+
+ fclose(f);
+
+ return pid;
+}
+
+pid_t cgroup_bonding_search_main_pid_list(CGroupBonding *first) {
+ CGroupBonding *b;
+ pid_t pid;
+
+ /* Try to find a main pid from this cgroup, but checking if
+ * there's only one PID in the cgroup and returning it. Later
+ * on we might want to add additional, smarter heuristics
+ * here. */
+
+ LIST_FOREACH(by_unit, b, first)
+ if ((pid = cgroup_bonding_search_main_pid(b)) != 0)
+ return pid;
+
+ return 0;
+
+}