diff options
author | Lennart Poettering <lennart@poettering.net> | 2017-07-17 23:35:25 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2017-07-31 18:20:28 +0200 |
commit | 6f8cbcdb27d772521ba71f92c25fd522efd56cf4 (patch) | |
tree | ec75be421e849676a46970b0034db67e6774a00f | |
parent | 7a1f1aaa789ae37b548bf55795e1733a21856c85 (diff) | |
download | systemd-6f8cbcdb27d772521ba71f92c25fd522efd56cf4.tar.gz |
process-util: slightly optimize querying of our own process metadata
When we are checking our own data, we can optimize things a bit.
-rw-r--r-- | src/basic/process-util.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/src/basic/process-util.c b/src/basic/process-util.c index ce6a59c8a4..f5bd6c9487 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -388,7 +388,7 @@ int is_kernel_thread(pid_t pid) { bool eof; FILE *f; - if (pid == 0 || pid == 1) /* pid 1, and we ourselves certainly aren't a kernel thread */ + if (pid == 0 || pid == 1 || pid == getpid_cached()) /* pid 1, and we ourselves certainly aren't a kernel thread */ return 0; assert(pid > 1); @@ -471,6 +471,9 @@ static int get_process_id(pid_t pid, const char *field, uid_t *uid) { assert(field); assert(uid); + if (pid < 0) + return -EINVAL; + p = procfs_file_alloca(pid, "status"); f = fopen(p, "re"); if (!f) { @@ -498,10 +501,22 @@ static int get_process_id(pid_t pid, const char *field, uid_t *uid) { } int get_process_uid(pid_t pid, uid_t *uid) { + + if (pid == 0 || pid == getpid_cached()) { + *uid = getuid(); + return 0; + } + return get_process_id(pid, "Uid:", uid); } int get_process_gid(pid_t pid, gid_t *gid) { + + if (pid == 0 || pid == getpid_cached()) { + *gid = getgid(); + return 0; + } + assert_cc(sizeof(uid_t) == sizeof(gid_t)); return get_process_id(pid, "Gid:", gid); } @@ -577,7 +592,7 @@ int get_process_ppid(pid_t pid, pid_t *_ppid) { assert(pid >= 0); assert(_ppid); - if (pid == 0) { + if (pid == 0 || pid == getpid_cached()) { *_ppid = getppid(); return 0; } @@ -775,6 +790,9 @@ bool pid_is_unwaited(pid_t pid) { if (pid <= 1) /* If we or PID 1 would be dead and have been waited for, this code would not be running */ return true; + if (pid == getpid_cached()) + return true; + if (kill(pid, 0) >= 0) return true; @@ -792,6 +810,9 @@ bool pid_is_alive(pid_t pid) { if (pid <= 1) /* If we or PID 1 would be a zombie, this code would not be running */ return true; + if (pid == getpid_cached()) + return true; + r = get_process_state(pid); if (r == -ESRCH || r == 'Z') return false; @@ -803,7 +824,10 @@ int pid_from_same_root_fs(pid_t pid) { const char *root; if (pid < 0) - return 0; + return false; + + if (pid == 0 || pid == getpid_cached()) + return true; root = procfs_file_alloca(pid, "root"); |