Chromium Code Reviews| Index: base/process/process_metrics_linux.cc |
| diff --git a/base/process/process_metrics_linux.cc b/base/process/process_metrics_linux.cc |
| index adca7c5ee23bd53914342cffd2aab166402fe920..8b87aa772832bc03045a76ab62e0a718dc730285 100644 |
| --- a/base/process/process_metrics_linux.cc |
| +++ b/base/process/process_metrics_linux.cc |
| @@ -48,20 +48,12 @@ static uint64 ReadFileToUint64(const FilePath file) { |
| } |
| #endif |
| -// Read /proc/<pid>/status and return the value for |field|, or 0 on failure. |
| -// Only works for fields in the form of "Field: value kB". |
| -size_t ReadProcStatusAndGetFieldAsSizeT(pid_t pid, const std::string& field) { |
| - std::string status; |
| - { |
| - // Synchronously reading files in /proc does not hit the disk. |
| - ThreadRestrictions::ScopedAllowIO allow_io; |
| - FilePath stat_file = internal::GetProcPidDir(pid).Append("status"); |
| - if (!ReadFileToString(stat_file, &status)) |
| - return 0; |
| - } |
| - |
| +// Parse the contents of status file and return the value of the field |
| +// requested. |
| +size_t ParseProcStatsAndGetFieldAsSizeT(const char* status_contents, |
|
Lei Zhang
2015/10/06 21:09:00
Just use StringPiece instead of const char* ? Then
ssid
2015/10/07 09:12:15
changed to string
|
| + const std::string& field) { |
| StringPairs pairs; |
| - SplitStringIntoKeyValuePairs(status, ':', '\n', &pairs); |
| + SplitStringIntoKeyValuePairs(status_contents, ':', '\n', &pairs); |
| TrimKeyValuePairs(&pairs); |
| for (size_t i = 0; i < pairs.size(); ++i) { |
| const std::string& key = pairs[i].first; |
| @@ -85,6 +77,35 @@ size_t ReadProcStatusAndGetFieldAsSizeT(pid_t pid, const std::string& field) { |
| return 0; |
| } |
| +// Read /proc/<pid>/status and return the value for |field|, or 0 on failure. |
| +// Only works for fields in the form of "Field: value kB". |
| +size_t ReadProcStatusAndGetFieldAsSizeT(pid_t pid, const std::string& field) { |
| + std::string status; |
| + { |
| + // Synchronously reading files in /proc does not hit the disk. |
| + ThreadRestrictions::ScopedAllowIO allow_io; |
| + FilePath stat_file = internal::GetProcPidDir(pid).Append("status"); |
| + if (!ReadFileToString(stat_file, &status)) |
| + return 0; |
| + } |
| + return ParseProcStatsAndGetFieldAsSizeT(status.c_str(), field); |
| +} |
| + |
| +// Read file descriptor passed file descritor of /proc/<pid>/status and return |
| +// the value for |field|, or 0 on failure. |
| +// Only works for fields in the form of "Field: value kB". |
| +size_t ReadProcStatusFdAndGetFieldAsSizeT(PlatformFile proc_status_fd, |
|
Lei Zhang
2015/10/06 21:09:00
/proc/<pid>/status isn't that big, right? Why both
ssid
2015/10/07 09:12:14
yes, I moved the reading part to other file and no
|
| + const std::string& field) { |
| + const size_t kMaxStatFileSize = 1 << 12; |
|
Lei Zhang
2015/10/06 21:09:00
Easier to just write 4096?
ssid
2015/10/07 09:12:15
Done.
|
| + char status_data[kMaxStatFileSize]; |
| + status_data[0] = '\0'; |
| + lseek(proc_status_fd, 0, SEEK_SET); |
|
Lei Zhang
2015/10/06 21:09:00
Check return value?
ssid
2015/10/07 09:12:15
Done.
|
| + ReadFromFD(proc_status_fd, status_data, kMaxStatFileSize); |
|
Lei Zhang
2015/10/06 21:09:00
Ditto, check this return value in place of the nex
ssid
2015/10/07 09:12:14
Done.
|
| + if (strlen(status_data) == 0) |
| + return 0; |
| + return ParseProcStatsAndGetFieldAsSizeT(status_data, field); |
| +} |
| + |
| #if defined(OS_LINUX) |
| // Read /proc/<pid>/sched and look for |field|. On succes, return true and |
| // write the value for |field| into |result|. |
| @@ -393,6 +414,14 @@ bool ProcessMetrics::GetWorkingSetKBytesStatm(WorkingSetKBytes* ws_usage) |
| return ret; |
| } |
| +size_t ProcessMetrics::GetWorkingSetSize(int proc_status_fd) const { |
| + return ReadProcStatusFdAndGetFieldAsSizeT(proc_status_fd, "VmRSS") * 1024; |
| +} |
| + |
| +size_t ProcessMetrics::GetPeakWorkingSetSize(int proc_status_fd) const { |
| + return ReadProcStatusFdAndGetFieldAsSizeT(proc_status_fd, "VmHWM") * 1024; |
| +} |
| + |
| size_t GetSystemCommitCharge() { |
| SystemMemoryInfoKB meminfo; |
| if (!GetSystemMemoryInfo(&meminfo)) |