diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-02-03 05:25:31 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-02-03 05:25:31 +0100 |
commit | acb14d318b84bda00d1e666d7dab6794d5bbeb3f (patch) | |
tree | bb30240c680d5a92ca61189ba8b0a8ebf2672004 /src/cgroup.c | |
parent | cd43ca73e19511f999c80995937e418c35c30ee8 (diff) |
cgroup: when getting cgroup empty notifications, always search up the tree
Diffstat (limited to 'src/cgroup.c')
-rw-r--r-- | src/cgroup.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/src/cgroup.c b/src/cgroup.c index 9aff02e7bc..182dd59eec 100644 --- a/src/cgroup.c +++ b/src/cgroup.c @@ -355,15 +355,55 @@ void manager_shutdown_cgroup(Manager *m, bool delete) { m->cgroup_hierarchy = NULL; } +int cgroup_bonding_get(Manager *m, const char *cgroup, CGroupBonding **bonding) { + CGroupBonding *b; + char *p; + + assert(m); + assert(cgroup); + assert(bonding); + + b = hashmap_get(m->cgroup_bondings, cgroup); + if (!b) { + *bonding = b; + return 1; + } + + p = strdup(cgroup); + if (!p) + return -ENOMEM; + + for (;;) { + char *e; + + e = strrchr(p, '/'); + if (!e || e == p) { + free(p); + *bonding = NULL; + return 0; + } + + *e = 0; + + b = hashmap_get(m->cgroup_bondings, p); + if (b) { + free(p); + *bonding = b; + return 1; + } + } +} + int cgroup_notify_empty(Manager *m, const char *group) { CGroupBonding *l, *b; + int r; assert(m); assert(group); - l = hashmap_get(m->cgroup_bondings, group); - if (!l) - return 0; + r = cgroup_bonding_get(m, group, &l); + if (r <= 0) + return r; LIST_FOREACH(by_path, b, l) { int t; |