| OLD | NEW |
| (Empty) |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "process_info.h" | |
| 6 | |
| 7 #include <ctype.h> | |
| 8 #include <dirent.h> | |
| 9 #include <stdio.h> | |
| 10 #include <stdlib.h> | |
| 11 #include <sys/types.h> | |
| 12 | |
| 13 #include "file_utils.h" | |
| 14 #include "logging.h" | |
| 15 | |
| 16 ProcessInfo::ProcessInfo(int pid) : memory_(pid), pid_(pid) {} | |
| 17 | |
| 18 bool ProcessInfo::IsProcess(int pid) { | |
| 19 char buf[256]; | |
| 20 ssize_t rsize = file_utils::ReadProcFile(pid, "status", buf, sizeof(buf)); | |
| 21 if (rsize <= 0) | |
| 22 return false; | |
| 23 const char kTgid[] = "\nTgid:"; | |
| 24 const char* tgid_line = strstr(buf, kTgid); | |
| 25 CHECK(tgid_line); | |
| 26 int tgid = 0; | |
| 27 if (sscanf(tgid_line + strlen(kTgid), "%d", &tgid) != 1) | |
| 28 CHECK(false); | |
| 29 return tgid == pid; | |
| 30 } | |
| 31 | |
| 32 bool ProcessInfo::ReadProcessName() { | |
| 33 if (!file_utils::ReadProcFileTrimmed(pid_, "cmdline", name_, sizeof(name_))) | |
| 34 return false; | |
| 35 | |
| 36 // Fallback on "comm" for kernel threads. | |
| 37 if (strlen(name_) == 0) { | |
| 38 if (!file_utils::ReadProcFileTrimmed(pid_, "comm", name_, sizeof(name_))) | |
| 39 return false; | |
| 40 } | |
| 41 | |
| 42 // Get also the exe path, to distinguish system vs java apps and bitness. | |
| 43 char exe_path[64]; | |
| 44 sprintf(exe_path, "/proc/%d/exe", pid_); | |
| 45 exe_[0] = '\0'; | |
| 46 ssize_t res = readlink(exe_path, exe_, sizeof(exe_) - 1); | |
| 47 if (res >= 0) | |
| 48 exe_[res] = '\0'; | |
| 49 | |
| 50 return true; | |
| 51 } | |
| 52 | |
| 53 bool ProcessInfo::ReadThreadNames() { | |
| 54 char tasks_path[64]; | |
| 55 sprintf(tasks_path, "/proc/%d/task", pid_); | |
| 56 CHECK(threads_.empty()); | |
| 57 ThreadInfoMap* threads = &threads_; | |
| 58 const int pid = pid_; | |
| 59 file_utils::ForEachPidInProcPath(tasks_path, [pid, threads](int tid) { | |
| 60 char comm[64]; | |
| 61 std::unique_ptr<ThreadInfo> thread_info(new ThreadInfo()); | |
| 62 sprintf(comm, "task/%d/comm", tid); | |
| 63 if (!file_utils::ReadProcFileTrimmed(pid, comm, thread_info->name, | |
| 64 sizeof(thread_info->name))) { | |
| 65 return; | |
| 66 } | |
| 67 (*threads)[tid] = std::move(thread_info); | |
| 68 }); | |
| 69 return true; | |
| 70 } | |
| 71 | |
| 72 bool ProcessInfo::ReadOOMStats() { | |
| 73 char buf[512]; | |
| 74 if (file_utils::ReadProcFileTrimmed(pid_, "oom_adj", buf, sizeof(buf))) | |
| 75 oom_adj_ = atoi(buf); | |
| 76 else | |
| 77 return false; | |
| 78 | |
| 79 if (file_utils::ReadProcFileTrimmed(pid_, "oom_score", buf, sizeof(buf))) | |
| 80 oom_score_ = atoi(buf); | |
| 81 else | |
| 82 return false; | |
| 83 | |
| 84 if (file_utils::ReadProcFileTrimmed(pid_, "oom_score_adj", buf, sizeof(buf))) | |
| 85 oom_score_adj_ = atoi(buf); | |
| 86 else | |
| 87 return false; | |
| 88 | |
| 89 return true; | |
| 90 } | |
| 91 | |
| 92 bool ProcessInfo::ReadPageFaultsAndCPUTimeStats() { | |
| 93 char buf[512]; | |
| 94 if (!file_utils::ReadProcFileTrimmed(pid_, "stat", buf, sizeof(buf))) | |
| 95 return false; | |
| 96 int ret = sscanf(buf, | |
| 97 "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*u %lu %*lu " | |
| 98 "%lu %*lu %lu %lu %*ld %*ld %*ld %*ld %*ld %*ld %llu", | |
| 99 &minflt_, &majflt_, &utime_, &stime_, &start_time_); | |
| 100 CHECK(ret == 5); | |
| 101 return true; | |
| 102 } | |
| OLD | NEW |