int cg_enter_current(const char *cgroup)
 {
-       char pidbuf[64];
+       return cg_write(cgroup, "cgroup.procs", "0");
+}
 
-       snprintf(pidbuf, sizeof(pidbuf), "%d", getpid());
-       return cg_write(cgroup, "cgroup.procs", pidbuf);
+int cg_enter_current_thread(const char *cgroup)
+{
+       return cg_write(cgroup, "cgroup.threads", "0");
 }
 
 int cg_run(const char *cgroup,
        return 0;
 }
 
-char proc_read_text(int pid, const char *item, char *buf, size_t size)
+ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t size)
 {
        char path[PATH_MAX];
 
-       snprintf(path, sizeof(path), "/proc/%d/%s", pid, item);
+       if (!pid)
+               snprintf(path, sizeof(path), "/proc/%s/%s",
+                        thread ? "thread-self" : "self", item);
+       else
+               snprintf(path, sizeof(path), "/proc/%d/%s", pid, item);
 
        return read_text(path, buf, size);
 }
 
 /* SPDX-License-Identifier: GPL-2.0 */
+#include <stdbool.h>
 #include <stdlib.h>
 
 #define PAGE_SIZE 4096
                  void *arg);
 extern int cg_enter(const char *cgroup, int pid);
 extern int cg_enter_current(const char *cgroup);
+extern int cg_enter_current_thread(const char *cgroup);
 extern int cg_run_nowait(const char *cgroup,
                         int (*fn)(const char *cgroup, void *arg),
                         void *arg);
 extern int set_oom_adj_score(int pid, int score);
 extern int cg_wait_for_proc_count(const char *cgroup, int count);
 extern int cg_killall(const char *cgroup);
-extern char proc_read_text(int pid, const char *item, char *buf, size_t size);
+extern ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t size);
 
        char buf[PAGE_SIZE];
        int len;
 
-       len = proc_read_text(pid, "stat", buf, sizeof(buf));
+       len = proc_read_text(pid, 0, "stat", buf, sizeof(buf));
        if (len == -1) {
                debug("Can't get %d stat\n", pid);
                return -1;