summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/basic/cgroup-util.c24
-rw-r--r--src/basic/cgroup-util.h2
2 files changed, 26 insertions, 0 deletions
diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c
index 289e4fe073..95bf177a6b 100644
--- a/src/basic/cgroup-util.c
+++ b/src/basic/cgroup-util.c
@@ -1688,6 +1688,30 @@ int cg_slice_to_path(const char *unit, char **ret) {
return 0;
}
+int cg_is_threaded(const char *controller, const char *path) {
+ _cleanup_free_ char *fs = NULL, *contents = NULL;
+ _cleanup_strv_free_ char **v = NULL;
+ int r;
+
+ r = cg_get_path(controller, path, "cgroup.type", &fs);
+ if (r < 0)
+ return r;
+
+ r = read_full_virtual_file(fs, &contents, NULL);
+ if (r == -ENOENT)
+ return false; /* Assume no. */
+ if (r < 0)
+ return r;
+
+ v = strv_split(contents, NULL);
+ if (!v)
+ return -ENOMEM;
+
+ /* If the cgroup is in the threaded mode, it contains "threaded".
+ * If one of the parents or siblings is in the threaded mode, it may contain "invalid". */
+ return strv_contains(v, "threaded") || strv_contains(v, "invalid");
+}
+
int cg_set_attribute(const char *controller, const char *path, const char *attribute, const char *value) {
_cleanup_free_ char *p = NULL;
int r;
diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h
index 461c01b3c2..4c413a8d17 100644
--- a/src/basic/cgroup-util.h
+++ b/src/basic/cgroup-util.h
@@ -205,6 +205,8 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path);
int cg_rmdir(const char *controller, const char *path);
+int cg_is_threaded(const char *controller, const char *path);
+
typedef enum {
CG_KEY_MODE_GRACEFUL = 1 << 0,
} CGroupKeyMode;