summaryrefslogtreecommitdiff
path: root/src/shared/cgroup-util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-04-16 17:35:58 +0200
committerLennart Poettering <lennart@poettering.net>2012-04-16 18:59:08 +0200
commitc3175a7f40a2d2fabc3a2de63033a6810d45221a (patch)
tree60f589e8b66241145a03b7c65890cec649510f5d /src/shared/cgroup-util.c
parentc7b5eb98e8eeafe63a079ee3c51e9670872437ae (diff)
cgls: don't show empty cgroups by default
Diffstat (limited to 'src/shared/cgroup-util.c')
-rw-r--r--src/shared/cgroup-util.c62
1 files changed, 35 insertions, 27 deletions
diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c
index b2fb324a18..48da4cb3b7 100644
--- a/src/shared/cgroup-util.c
+++ b/src/shared/cgroup-util.c
@@ -40,11 +40,11 @@ int cg_enumerate_processes(const char *controller, const char *path, FILE **_f)
int r;
FILE *f;
- assert(controller);
assert(path);
assert(_f);
- if ((r = cg_get_path(controller, path, "cgroup.procs", &fs)) < 0)
+ r = cg_get_path(controller, path, "cgroup.procs", &fs);
+ if (r < 0)
return r;
f = fopen(fs, "re");
@@ -62,11 +62,11 @@ int cg_enumerate_tasks(const char *controller, const char *path, FILE **_f) {
int r;
FILE *f;
- assert(controller);
assert(path);
assert(_f);
- if ((r = cg_get_path(controller, path, "tasks", &fs)) < 0)
+ r = cg_get_path(controller, path, "tasks", &fs);
+ if (r < 0)
return r;
f = fopen(fs, "re");
@@ -106,13 +106,13 @@ int cg_enumerate_subgroups(const char *controller, const char *path, DIR **_d) {
int r;
DIR *d;
- assert(controller);
assert(path);
assert(_d);
/* This is not recursive! */
- if ((r = cg_get_path(controller, path, NULL, &fs)) < 0)
+ r = cg_get_path(controller, path, NULL, &fs);
+ if (r < 0)
return r;
d = opendir(fs);
@@ -515,14 +515,24 @@ static const char *normalize_controller(const char *controller) {
static int join_path(const char *controller, const char *path, const char *suffix, char **fs) {
char *t;
- if (path && suffix)
- t = join("/sys/fs/cgroup/", controller, "/", path, "/", suffix, NULL);
- else if (path)
- t = join("/sys/fs/cgroup/", controller, "/", path, NULL);
- else if (suffix)
- t = join("/sys/fs/cgroup/", controller, "/", suffix, NULL);
- else
- t = join("/sys/fs/cgroup/", controller, NULL);
+ if (!(controller || path))
+ return -EINVAL;
+
+ if (controller) {
+ if (path && suffix)
+ t = join("/sys/fs/cgroup/", controller, "/", path, "/", suffix, NULL);
+ else if (path)
+ t = join("/sys/fs/cgroup/", controller, "/", path, NULL);
+ else if (suffix)
+ t = join("/sys/fs/cgroup/", controller, "/", suffix, NULL);
+ else
+ t = join("/sys/fs/cgroup/", controller, NULL);
+ } else {
+ if (path && suffix)
+ t = join(path, "/", suffix, NULL);
+ else if (path)
+ t = strdup(path);
+ }
if (!t)
return -ENOMEM;
@@ -537,12 +547,8 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch
const char *p;
static __thread bool good = false;
- assert(controller);
assert(fs);
- if (isempty(controller))
- return -EINVAL;
-
if (_unlikely_(!good)) {
int r;
@@ -554,8 +560,7 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch
good = true;
}
- p = normalize_controller(controller);
-
+ p = controller ? normalize_controller(controller) : NULL;
return join_path(p, path, suffix, fs);
}
@@ -883,20 +888,22 @@ finish:
}
int cg_is_empty(const char *controller, const char *path, bool ignore_self) {
- pid_t pid = 0;
+ pid_t pid = 0, self_pid;
int r;
FILE *f = NULL;
bool found = false;
- assert(controller);
assert(path);
- if ((r = cg_enumerate_tasks(controller, path, &f)) < 0)
+ r = cg_enumerate_tasks(controller, path, &f);
+ if (r < 0)
return r == -ENOENT ? 1 : r;
+ self_pid = getpid();
+
while ((r = cg_read_pid(f, &pid)) > 0) {
- if (ignore_self && pid == getpid())
+ if (ignore_self && pid == self_pid)
continue;
found = true;
@@ -916,13 +923,14 @@ int cg_is_empty_recursive(const char *controller, const char *path, bool ignore_
DIR *d = NULL;
char *fn;
- assert(controller);
assert(path);
- if ((r = cg_is_empty(controller, path, ignore_self)) <= 0)
+ r = cg_is_empty(controller, path, ignore_self);
+ if (r <= 0)
return r;
- if ((r = cg_enumerate_subgroups(controller, path, &d)) < 0)
+ r = cg_enumerate_subgroups(controller, path, &d);
+ if (r < 0)
return r == -ENOENT ? 1 : r;
while ((r = cg_read_subgroup(d, &fn)) > 0) {