X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcgroup.c;h=1f6139e25f752176b2d19781c1253c8e608f8dc9;hp=9aff02e7bc1084f323a6267fe301887e82b92f2c;hb=19c5f19d69bb5f520fa7213239490c55de06d99d;hpb=8d53b4534a5923721b5f1e9dd7e8f4a903d02d51 diff --git a/src/cgroup.c b/src/cgroup.c index 9aff02e7b..1f6139e25 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;