| Index: base/process/process_metrics_linux.cc
|
| diff --git a/base/process/process_metrics_linux.cc b/base/process/process_metrics_linux.cc
|
| index eb7caf75fd9752f198c35c9b3c2c7a128ac6e33b..1dde0d957fdb7902b24f92a090cbffd1ea7e7744 100644
|
| --- a/base/process/process_metrics_linux.cc
|
| +++ b/base/process/process_metrics_linux.cc
|
| @@ -32,60 +32,70 @@ namespace base {
|
| namespace {
|
|
|
| void TrimKeyValuePairs(StringPairs* pairs) {
|
| - DCHECK(pairs);
|
| - StringPairs& p_ref = *pairs;
|
| - for (size_t i = 0; i < p_ref.size(); ++i) {
|
| - TrimWhitespaceASCII(p_ref[i].first, TRIM_ALL, &p_ref[i].first);
|
| - TrimWhitespaceASCII(p_ref[i].second, TRIM_ALL, &p_ref[i].second);
|
| + for (auto& pair : *pairs) {
|
| + TrimWhitespaceASCII(pair.first, TRIM_ALL, &pair.first);
|
| + TrimWhitespaceASCII(pair.second, TRIM_ALL, &pair.second);
|
| }
|
| }
|
|
|
| #if defined(OS_CHROMEOS)
|
| // Read a file with a single number string and return the number as a uint64_t.
|
| -static uint64_t ReadFileToUint64(const FilePath file) {
|
| - std::string file_as_string;
|
| - if (!ReadFileToString(file, &file_as_string))
|
| +uint64_t ReadFileToUint64(const FilePath& file) {
|
| + std::string file_contents;
|
| + if (!ReadFileToString(file, &file_contents))
|
| return 0;
|
| - TrimWhitespaceASCII(file_as_string, TRIM_ALL, &file_as_string);
|
| - uint64_t file_as_uint64 = 0;
|
| - if (!StringToUint64(file_as_string, &file_as_uint64))
|
| + TrimWhitespaceASCII(file_contents, TRIM_ALL, &file_contents);
|
| + uint64_t file_contents_uint64 = 0;
|
| + if (!StringToUint64(file_contents, &file_contents_uint64))
|
| return 0;
|
| - return file_as_uint64;
|
| + return file_contents_uint64;
|
| }
|
| #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) {
|
| +// Read |filename| in /proc/<pid>/, split the entries into key/value pairs, and
|
| +// trim the key and value. On success, return true and write the trimmed
|
| +// key/value pairs into |key_value_pairs|.
|
| +bool ReadProcFileToTrimmedStringPairs(pid_t pid,
|
| + StringPiece filename,
|
| + StringPairs* key_value_pairs) {
|
| std::string status_data;
|
| {
|
| // Synchronously reading files in /proc does not hit the disk.
|
| ThreadRestrictions::ScopedAllowIO allow_io;
|
| - FilePath status_file = internal::GetProcPidDir(pid).Append("status");
|
| + FilePath status_file = internal::GetProcPidDir(pid).Append(filename);
|
| if (!ReadFileToString(status_file, &status_data))
|
| - return 0;
|
| + return false;
|
| }
|
| + SplitStringIntoKeyValuePairs(status_data, ':', '\n', key_value_pairs);
|
| + TrimKeyValuePairs(key_value_pairs);
|
| + return true;
|
| +}
|
|
|
| +// 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, StringPiece field) {
|
| StringPairs pairs;
|
| - SplitStringIntoKeyValuePairs(status_data, ':', '\n', &pairs);
|
| - TrimKeyValuePairs(&pairs);
|
| - for (size_t i = 0; i < pairs.size(); ++i) {
|
| - const std::string& key = pairs[i].first;
|
| - const std::string& value_str = pairs[i].second;
|
| - if (key == field) {
|
| - std::vector<StringPiece> split_value_str =
|
| - SplitStringPiece(value_str, " ", TRIM_WHITESPACE, SPLIT_WANT_ALL);
|
| - if (split_value_str.size() != 2 || split_value_str[1] != "kB") {
|
| - NOTREACHED();
|
| - return 0;
|
| - }
|
| - size_t value;
|
| - if (!StringToSizeT(split_value_str[0], &value)) {
|
| - NOTREACHED();
|
| - return 0;
|
| - }
|
| - return value;
|
| + if (!ReadProcFileToTrimmedStringPairs(pid, "status", &pairs))
|
| + return 0;
|
| +
|
| + for (const auto& pair : pairs) {
|
| + const std::string& key = pair.first;
|
| + const std::string& value_str = pair.second;
|
| + if (key != field)
|
| + continue;
|
| +
|
| + std::vector<StringPiece> split_value_str =
|
| + SplitStringPiece(value_str, " ", TRIM_WHITESPACE, SPLIT_WANT_ALL);
|
| + if (split_value_str.size() != 2 || split_value_str[1] != "kB") {
|
| + NOTREACHED();
|
| + return 0;
|
| }
|
| + size_t value;
|
| + if (!StringToSizeT(split_value_str[0], &value)) {
|
| + NOTREACHED();
|
| + return 0;
|
| + }
|
| + return value;
|
| }
|
| // This can be reached if the process dies when proc is read -- in that case,
|
| // the kernel can return missing fields.
|
| @@ -97,30 +107,23 @@ size_t ReadProcStatusAndGetFieldAsSizeT(pid_t pid, const std::string& field) {
|
| // write the value for |field| into |result|.
|
| // Only works for fields in the form of "field : uint_value"
|
| bool ReadProcStatusAndGetFieldAsUint64(pid_t pid,
|
| - const std::string& field,
|
| + StringPiece field,
|
| uint64_t* result) {
|
| - std::string status_data;
|
| - {
|
| - // Synchronously reading files in /proc does not hit the disk.
|
| - ThreadRestrictions::ScopedAllowIO allow_io;
|
| - FilePath status_file = internal::GetProcPidDir(pid).Append("status");
|
| - if (!ReadFileToString(status_file, &status_data))
|
| - return false;
|
| - }
|
| -
|
| StringPairs pairs;
|
| - SplitStringIntoKeyValuePairs(status_data, ':', '\n', &pairs);
|
| - TrimKeyValuePairs(&pairs);
|
| - for (size_t i = 0; i < pairs.size(); ++i) {
|
| - const std::string& key = pairs[i].first;
|
| - const std::string& value_str = pairs[i].second;
|
| - if (key == field) {
|
| - uint64_t value;
|
| - if (!StringToUint64(value_str, &value))
|
| - return false;
|
| - *result = value;
|
| - return true;
|
| - }
|
| + if (!ReadProcFileToTrimmedStringPairs(pid, "status", &pairs))
|
| + return false;
|
| +
|
| + for (const auto& pair : pairs) {
|
| + const std::string& key = pair.first;
|
| + const std::string& value_str = pair.second;
|
| + if (key != field)
|
| + continue;
|
| +
|
| + uint64_t value;
|
| + if (!StringToUint64(value_str, &value))
|
| + return false;
|
| + *result = value;
|
| + return true;
|
| }
|
| return false;
|
| }
|
| @@ -169,24 +172,24 @@ std::unique_ptr<ProcessMetrics> ProcessMetrics::CreateProcessMetrics(
|
| return WrapUnique(new ProcessMetrics(process));
|
| }
|
|
|
| -// On linux, we return vsize.
|
| +// On Linux, return vsize.
|
| size_t ProcessMetrics::GetPagefileUsage() const {
|
| return internal::ReadProcStatsAndGetFieldAsSizeT(process_,
|
| internal::VM_VSIZE);
|
| }
|
|
|
| -// On linux, we return the high water mark of vsize.
|
| +// On Linux, return the high water mark of vsize.
|
| size_t ProcessMetrics::GetPeakPagefileUsage() const {
|
| return ReadProcStatusAndGetFieldAsSizeT(process_, "VmPeak") * 1024;
|
| }
|
|
|
| -// On linux, we return RSS.
|
| +// On Linux, return RSS.
|
| size_t ProcessMetrics::GetWorkingSetSize() const {
|
| return internal::ReadProcStatsAndGetFieldAsSizeT(process_, internal::VM_RSS) *
|
| getpagesize();
|
| }
|
|
|
| -// On linux, we return the high water mark of RSS.
|
| +// On Linux, return the high water mark of RSS.
|
| size_t ProcessMetrics::GetPeakWorkingSetSize() const {
|
| return ReadProcStatusAndGetFieldAsSizeT(process_, "VmHWM") * 1024;
|
| }
|
| @@ -232,8 +235,8 @@ double ProcessMetrics::GetCPUUsage() {
|
|
|
| int cpu = GetProcessCPU(process_);
|
|
|
| - // We have the number of jiffies in the time period. Convert to percentage.
|
| - // Note this means we will go *over* 100 in the case where multiple threads
|
| + // The number of jiffies in the time period. Convert to percentage.
|
| + // Note: this means this will go *over* 100 in the case where multiple threads
|
| // are together adding to more than one CPU's worth.
|
| TimeDelta cpu_time = internal::ClockTicksToTimeDelta(cpu);
|
| TimeDelta last_cpu_time = internal::ClockTicksToTimeDelta(last_cpu_);
|
| @@ -241,7 +244,7 @@ double ProcessMetrics::GetCPUUsage() {
|
| // If the number of threads running in the process has decreased since the
|
| // last time this function was called, |last_cpu_time| will be greater than
|
| // |cpu_time| which will result in a negative value in the below percentage
|
| - // calculation. We prevent this by clamping to 0. crbug.com/546565.
|
| + // calculation. Prevent this by clamping to 0. https://crbug.com/546565.
|
| // This computation is known to be shaky when threads are destroyed between
|
| // "last" and "now", but for our current purposes, it's all right.
|
| double percentage = 0.0;
|
| @@ -256,27 +259,20 @@ double ProcessMetrics::GetCPUUsage() {
|
| return percentage;
|
| }
|
|
|
| -// To have /proc/self/io file you must enable CONFIG_TASK_IO_ACCOUNTING
|
| -// in your kernel configuration.
|
| +// For the /proc/self/io file to exist, the Linux kernel must have
|
| +// CONFIG_TASK_IO_ACCOUNTING enabled.
|
| bool ProcessMetrics::GetIOCounters(IoCounters* io_counters) const {
|
| - // Synchronously reading files in /proc does not hit the disk.
|
| - ThreadRestrictions::ScopedAllowIO allow_io;
|
| -
|
| - std::string proc_io_contents;
|
| - FilePath io_file = internal::GetProcPidDir(process_).Append("io");
|
| - if (!ReadFileToString(io_file, &proc_io_contents))
|
| + StringPairs pairs;
|
| + if (!ReadProcFileToTrimmedStringPairs(process_, "io", &pairs))
|
| return false;
|
|
|
| io_counters->OtherOperationCount = 0;
|
| io_counters->OtherTransferCount = 0;
|
|
|
| - StringPairs pairs;
|
| - SplitStringIntoKeyValuePairs(proc_io_contents, ':', '\n', &pairs);
|
| - TrimKeyValuePairs(&pairs);
|
| - for (size_t i = 0; i < pairs.size(); ++i) {
|
| - const std::string& key = pairs[i].first;
|
| - const std::string& value_str = pairs[i].second;
|
| - uint64_t* target_counter = NULL;
|
| + for (const auto& pair : pairs) {
|
| + const std::string& key = pair.first;
|
| + const std::string& value_str = pair.second;
|
| + uint64_t* target_counter = nullptr;
|
| if (key == "syscr")
|
| target_counter = &io_counters->ReadOperationCount;
|
| else if (key == "syscw")
|
| @@ -320,23 +316,22 @@ int ProcessMetrics::GetOpenFdSoftLimit() const {
|
| if (!ReadFileToString(fd_path, &limits_contents))
|
| return -1;
|
|
|
| - for (const auto& line :
|
| - base::SplitStringPiece(limits_contents, "\n", base::KEEP_WHITESPACE,
|
| - base::SPLIT_WANT_NONEMPTY)) {
|
| - if (line.starts_with("Max open files")) {
|
| - auto tokens = base::SplitStringPiece(line, " ", base::TRIM_WHITESPACE,
|
| - base::SPLIT_WANT_NONEMPTY);
|
| - if (tokens.size() > 3) {
|
| - int limit = -1;
|
| - if (StringToInt(tokens[3], &limit))
|
| - return limit;
|
| + for (const auto& line : SplitStringPiece(
|
| + limits_contents, "\n", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
|
| + if (!line.starts_with("Max open files"))
|
| + continue;
|
| +
|
| + auto tokens =
|
| + SplitStringPiece(line, " ", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
|
| + if (tokens.size() > 3) {
|
| + int limit = -1;
|
| + if (!StringToInt(tokens[3], &limit))
|
| return -1;
|
| - }
|
| + return limit;
|
| }
|
| }
|
| return -1;
|
| }
|
| -
|
| #endif // defined(OS_LINUX) || defined(OS_AIX)
|
|
|
| ProcessMetrics::ProcessMetrics(ProcessHandle process)
|
| @@ -399,7 +394,7 @@ bool ProcessMetrics::GetWorkingSetKBytesTotmaps(WorkingSetKBytes *ws_usage)
|
| ret &= StringToInt(totmaps_fields[kPrivate_DirtyIndex], &private_dirty);
|
| ret &= StringToInt(totmaps_fields[kSwapIndex], &swap);
|
|
|
| - // On ChromeOS swap is to zram. We count this as private / shared, as
|
| + // On ChromeOS, swap goes to zram. Count this as private / shared, as
|
| // increased swap decreases available RAM to user processes, which would
|
| // otherwise create surprising results.
|
| ws_usage->priv = private_clean + private_dirty + swap;
|
| @@ -417,7 +412,7 @@ bool ProcessMetrics::GetWorkingSetKBytesStatm(WorkingSetKBytes* ws_usage)
|
| // a) Large and slow to parse.
|
| // b) Unavailable in the SUID sandbox.
|
|
|
| - // First we need to get the page size, since everything is measured in pages.
|
| + // First get the page size, since everything is measured in pages.
|
| // For details, see: man 5 proc.
|
| const int page_size_kb = getpagesize() / 1024;
|
| if (page_size_kb <= 0)
|
| @@ -436,9 +431,10 @@ bool ProcessMetrics::GetWorkingSetKBytesStatm(WorkingSetKBytes* ws_usage)
|
| std::vector<StringPiece> statm_vec =
|
| SplitStringPiece(statm, " ", TRIM_WHITESPACE, SPLIT_WANT_ALL);
|
| if (statm_vec.size() != 7)
|
| - return false; // Not the format we expect.
|
| + return false; // Not the expected format.
|
|
|
| - int statm_rss, statm_shared;
|
| + int statm_rss;
|
| + int statm_shared;
|
| bool ret = true;
|
| ret &= StringToInt(statm_vec[1], &statm_rss);
|
| ret &= StringToInt(statm_vec[2], &statm_shared);
|
| @@ -464,7 +460,7 @@ size_t GetSystemCommitCharge() {
|
| return meminfo.total - meminfo.free - meminfo.buffers - meminfo.cached;
|
| }
|
|
|
| -int ParseProcStatCPU(const std::string& input) {
|
| +int ParseProcStatCPU(StringPiece input) {
|
| // |input| may be empty if the process disappeared somehow.
|
| // e.g. http://crbug.com/145811.
|
| if (input.empty())
|
| @@ -496,13 +492,13 @@ int ParseProcStatCPU(const std::string& input) {
|
| return -1;
|
| }
|
|
|
| -const char kProcSelfExe[] = "/proc/self/exe";
|
| -
|
| int GetNumberOfThreads(ProcessHandle process) {
|
| return internal::ReadProcStatsAndGetFieldAsInt64(process,
|
| internal::VM_NUMTHREADS);
|
| }
|
|
|
| +const char kProcSelfExe[] = "/proc/self/exe";
|
| +
|
| namespace {
|
|
|
| // The format of /proc/diskstats is:
|
| @@ -559,8 +555,7 @@ const size_t kDiskWeightedIOTime = 13;
|
| } // namespace
|
|
|
| std::unique_ptr<Value> SystemMemoryInfoKB::ToValue() const {
|
| - std::unique_ptr<DictionaryValue> res(new DictionaryValue());
|
| -
|
| + auto res = base::MakeUnique<DictionaryValue>();
|
| res->SetInteger("total", total);
|
| res->SetInteger("free", free);
|
| res->SetInteger("available", available);
|
| @@ -588,9 +583,7 @@ std::unique_ptr<Value> SystemMemoryInfoKB::ToValue() const {
|
| return std::move(res);
|
| }
|
|
|
| -// exposed for testing
|
| -bool ParseProcMeminfo(const std::string& meminfo_data,
|
| - SystemMemoryInfoKB* meminfo) {
|
| +bool ParseProcMeminfo(StringPiece meminfo_data, SystemMemoryInfoKB* meminfo) {
|
| // The format of /proc/meminfo is:
|
| //
|
| // MemTotal: 8235324 kB
|
| @@ -601,23 +594,23 @@ bool ParseProcMeminfo(const std::string& meminfo_data,
|
| // There is no guarantee on the ordering or position
|
| // though it doesn't appear to change very often
|
|
|
| - // As a basic sanity check, let's make sure we at least get non-zero
|
| - // MemTotal value
|
| + // As a basic sanity check at the end, make sure the MemTotal value will be at
|
| + // least non-zero. So start off with a zero total.
|
| meminfo->total = 0;
|
|
|
| for (const StringPiece& line : SplitStringPiece(
|
| meminfo_data, "\n", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
|
| std::vector<StringPiece> tokens = SplitStringPiece(
|
| line, kWhitespaceASCII, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
|
| - // HugePages_* only has a number and no suffix so we can't rely on
|
| - // there being exactly 3 tokens.
|
| + // HugePages_* only has a number and no suffix so there may not be exactly 3
|
| + // tokens.
|
| if (tokens.size() <= 1) {
|
| DLOG(WARNING) << "meminfo: tokens: " << tokens.size()
|
| << " malformed line: " << line.as_string();
|
| continue;
|
| }
|
|
|
| - int* target = NULL;
|
| + int* target = nullptr;
|
| if (tokens[0] == "MemTotal:")
|
| target = &meminfo->total;
|
| else if (tokens[0] == "MemFree:")
|
| @@ -645,7 +638,7 @@ bool ParseProcMeminfo(const std::string& meminfo_data,
|
| else if (tokens[0] == "SReclaimable:")
|
| target = &meminfo->reclaimable;
|
| #if defined(OS_CHROMEOS)
|
| - // Chrome OS has a tweaked kernel that allows us to query Shmem, which is
|
| + // Chrome OS has a tweaked kernel that allows querying Shmem, which is
|
| // usually video memory otherwise invisible to the OS.
|
| else if (tokens[0] == "Shmem:")
|
| target = &meminfo->shmem;
|
| @@ -656,13 +649,11 @@ bool ParseProcMeminfo(const std::string& meminfo_data,
|
| StringToInt(tokens[1], target);
|
| }
|
|
|
| - // Make sure we got a valid MemTotal.
|
| + // Make sure the MemTotal is valid.
|
| return meminfo->total > 0;
|
| }
|
|
|
| -// exposed for testing
|
| -bool ParseProcVmstat(const std::string& vmstat_data,
|
| - SystemMemoryInfoKB* meminfo) {
|
| +bool ParseProcVmstat(StringPiece vmstat_data, SystemMemoryInfoKB* meminfo) {
|
| // The format of /proc/vmstat is:
|
| //
|
| // nr_free_pages 299878
|
| @@ -671,9 +662,8 @@ bool ParseProcVmstat(const std::string& vmstat_data,
|
| // nr_inactive_file 2015629
|
| // ...
|
| //
|
| - // We iterate through the whole file because the position of the
|
| + // Iterate through the whole file because the position of the
|
| // fields are dependent on the kernel version and configuration.
|
| -
|
| for (const StringPiece& line : SplitStringPiece(
|
| vmstat_data, "\n", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
|
| std::vector<StringPiece> tokens = SplitStringPiece(
|
| @@ -782,7 +772,7 @@ SystemDiskInfo::SystemDiskInfo() {
|
| SystemDiskInfo::SystemDiskInfo(const SystemDiskInfo& other) = default;
|
|
|
| std::unique_ptr<Value> SystemDiskInfo::ToValue() const {
|
| - std::unique_ptr<DictionaryValue> res(new DictionaryValue());
|
| + auto res = base::MakeUnique<DictionaryValue>();
|
|
|
| // Write out uint64_t variables as doubles.
|
| // Note: this may discard some precision, but for JS there's no other option.
|
| @@ -801,9 +791,10 @@ std::unique_ptr<Value> SystemDiskInfo::ToValue() const {
|
| return std::move(res);
|
| }
|
|
|
| -bool IsValidDiskName(const std::string& candidate) {
|
| +bool IsValidDiskName(StringPiece candidate) {
|
| if (candidate.length() < 3)
|
| return false;
|
| +
|
| if (candidate[1] == 'd' &&
|
| (candidate[0] == 'h' || candidate[0] == 's' || candidate[0] == 'v')) {
|
| // [hsv]d[a-z]+ case
|
| @@ -815,14 +806,11 @@ bool IsValidDiskName(const std::string& candidate) {
|
| }
|
|
|
| const char kMMCName[] = "mmcblk";
|
| - const size_t kMMCNameLen = strlen(kMMCName);
|
| - if (candidate.length() < kMMCNameLen + 1)
|
| - return false;
|
| - if (candidate.compare(0, kMMCNameLen, kMMCName) != 0)
|
| + if (!candidate.starts_with(kMMCName))
|
| return false;
|
|
|
| // mmcblk[0-9]+ case
|
| - for (size_t i = kMMCNameLen; i < candidate.length(); ++i) {
|
| + for (size_t i = strlen(kMMCName); i < candidate.length(); ++i) {
|
| if (!isdigit(candidate[i]))
|
| return false;
|
| }
|
| @@ -842,7 +830,7 @@ bool GetSystemDiskInfo(SystemDiskInfo* diskinfo) {
|
|
|
| std::vector<StringPiece> diskinfo_lines = SplitStringPiece(
|
| diskinfo_data, "\n", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY);
|
| - if (diskinfo_lines.size() == 0) {
|
| + if (diskinfo_lines.empty()) {
|
| DLOG(WARNING) << "No lines found";
|
| return false;
|
| }
|
| @@ -876,31 +864,32 @@ bool GetSystemDiskInfo(SystemDiskInfo* diskinfo) {
|
| line, kWhitespaceASCII, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
|
|
|
| // Fields may have overflowed and reset to zero.
|
| - if (IsValidDiskName(disk_fields[kDiskDriveName].as_string())) {
|
| - StringToUint64(disk_fields[kDiskReads], &reads);
|
| - StringToUint64(disk_fields[kDiskReadsMerged], &reads_merged);
|
| - StringToUint64(disk_fields[kDiskSectorsRead], §ors_read);
|
| - StringToUint64(disk_fields[kDiskReadTime], &read_time);
|
| - StringToUint64(disk_fields[kDiskWrites], &writes);
|
| - StringToUint64(disk_fields[kDiskWritesMerged], &writes_merged);
|
| - StringToUint64(disk_fields[kDiskSectorsWritten], §ors_written);
|
| - StringToUint64(disk_fields[kDiskWriteTime], &write_time);
|
| - StringToUint64(disk_fields[kDiskIO], &io);
|
| - StringToUint64(disk_fields[kDiskIOTime], &io_time);
|
| - StringToUint64(disk_fields[kDiskWeightedIOTime], &weighted_io_time);
|
| -
|
| - diskinfo->reads += reads;
|
| - diskinfo->reads_merged += reads_merged;
|
| - diskinfo->sectors_read += sectors_read;
|
| - diskinfo->read_time += read_time;
|
| - diskinfo->writes += writes;
|
| - diskinfo->writes_merged += writes_merged;
|
| - diskinfo->sectors_written += sectors_written;
|
| - diskinfo->write_time += write_time;
|
| - diskinfo->io += io;
|
| - diskinfo->io_time += io_time;
|
| - diskinfo->weighted_io_time += weighted_io_time;
|
| - }
|
| + if (!IsValidDiskName(disk_fields[kDiskDriveName].as_string()))
|
| + continue;
|
| +
|
| + StringToUint64(disk_fields[kDiskReads], &reads);
|
| + StringToUint64(disk_fields[kDiskReadsMerged], &reads_merged);
|
| + StringToUint64(disk_fields[kDiskSectorsRead], §ors_read);
|
| + StringToUint64(disk_fields[kDiskReadTime], &read_time);
|
| + StringToUint64(disk_fields[kDiskWrites], &writes);
|
| + StringToUint64(disk_fields[kDiskWritesMerged], &writes_merged);
|
| + StringToUint64(disk_fields[kDiskSectorsWritten], §ors_written);
|
| + StringToUint64(disk_fields[kDiskWriteTime], &write_time);
|
| + StringToUint64(disk_fields[kDiskIO], &io);
|
| + StringToUint64(disk_fields[kDiskIOTime], &io_time);
|
| + StringToUint64(disk_fields[kDiskWeightedIOTime], &weighted_io_time);
|
| +
|
| + diskinfo->reads += reads;
|
| + diskinfo->reads_merged += reads_merged;
|
| + diskinfo->sectors_read += sectors_read;
|
| + diskinfo->read_time += read_time;
|
| + diskinfo->writes += writes;
|
| + diskinfo->writes_merged += writes_merged;
|
| + diskinfo->sectors_written += sectors_written;
|
| + diskinfo->write_time += write_time;
|
| + diskinfo->io += io;
|
| + diskinfo->io_time += io_time;
|
| + diskinfo->weighted_io_time += weighted_io_time;
|
| }
|
|
|
| return true;
|
| @@ -912,7 +901,7 @@ TimeDelta GetUserCpuTimeSinceBoot() {
|
|
|
| #if defined(OS_CHROMEOS)
|
| std::unique_ptr<Value> SwapInfo::ToValue() const {
|
| - std::unique_ptr<DictionaryValue> res(new DictionaryValue());
|
| + auto res = base::MakeUnique<DictionaryValue>();
|
|
|
| // Write out uint64_t variables as doubles.
|
| // Note: this may discard some precision, but for JS there's no other option.
|
| @@ -921,11 +910,10 @@ std::unique_ptr<Value> SwapInfo::ToValue() const {
|
| res->SetDouble("orig_data_size", static_cast<double>(orig_data_size));
|
| res->SetDouble("compr_data_size", static_cast<double>(compr_data_size));
|
| res->SetDouble("mem_used_total", static_cast<double>(mem_used_total));
|
| - if (compr_data_size > 0)
|
| - res->SetDouble("compression_ratio", static_cast<double>(orig_data_size) /
|
| - static_cast<double>(compr_data_size));
|
| - else
|
| - res->SetDouble("compression_ratio", 0);
|
| + double ratio = compr_data_size ? static_cast<double>(orig_data_size) /
|
| + static_cast<double>(compr_data_size)
|
| + : 0;
|
| + res->SetDouble("compression_ratio", ratio);
|
|
|
| return std::move(res);
|
| }
|
| @@ -939,7 +927,7 @@ void GetSwapInfo(SwapInfo* swap_info) {
|
| ReadFileToUint64(zram_path.Append("orig_data_size"));
|
| if (orig_data_size <= 4096) {
|
| // A single page is compressed at startup, and has a high compression
|
| - // ratio. We ignore this as it doesn't indicate any real swapping.
|
| + // ratio. Ignore this as it doesn't indicate any real swapping.
|
| swap_info->orig_data_size = 0;
|
| swap_info->num_reads = 0;
|
| swap_info->num_writes = 0;
|
|
|