summaryrefslogtreecommitdiff
path: root/src/basic/process-util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-02-08 18:01:26 +0100
committerLennart Poettering <lennart@poettering.net>2023-02-17 14:27:58 +0100
commit6aa90884a093040ddb2dd656c1bf93892420c804 (patch)
tree78f8bf36e87f23b12b3cedf8a0af874abd3374b6 /src/basic/process-util.c
parentceecf3d45d00a176dbdbeaec8e3179b635da6f1a (diff)
downloadsystemd-6aa90884a093040ddb2dd656c1bf93892420c804.tar.gz
process-util: add helper get_process_threads()
Let's add a proper helper for querying the number of threads in a process.
Diffstat (limited to 'src/basic/process-util.c')
-rw-r--r--src/basic/process-util.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/basic/process-util.c b/src/basic/process-util.c
index b6bf83c2cf..be82d0ffe7 100644
--- a/src/basic/process-util.c
+++ b/src/basic/process-util.c
@@ -1549,6 +1549,31 @@ _noreturn_ void freeze(void) {
pause();
}
+int get_process_threads(pid_t pid) {
+ _cleanup_free_ char *t = NULL;
+ const char *p;
+ int n, r;
+
+ if (pid < 0)
+ return -EINVAL;
+
+ p = procfs_file_alloca(pid, "status");
+
+ r = get_proc_field(p, "Threads", WHITESPACE, &t);
+ if (r == -ENOENT)
+ return proc_mounted() == 0 ? -ENOSYS : -ESRCH;
+ if (r < 0)
+ return r;
+
+ r = safe_atoi(t, &n);
+ if (r < 0)
+ return r;
+ if (n < 0)
+ return -EINVAL;
+
+ return n;
+}
+
static const char *const sigchld_code_table[] = {
[CLD_EXITED] = "exited",
[CLD_KILLED] = "killed",