diff options
-rw-r--r-- | base/string_util.cc | 14 | ||||
-rw-r--r-- | base/string_util.h | 2 | ||||
-rw-r--r-- | chrome/test/perf/mem_usage_linux.cc | 61 |
3 files changed, 71 insertions, 6 deletions
diff --git a/base/string_util.cc b/base/string_util.cc index ee0a9a5..c819373 100644 --- a/base/string_util.cc +++ b/base/string_util.cc @@ -1270,8 +1270,8 @@ std::wstring JoinString(const std::vector<std::wstring>& parts, wchar_t sep) { return JoinStringT(parts, sep); } -void SplitStringAlongWhitespace(const std::wstring& str, - std::vector<std::wstring>* result) { +template<typename STR> +void SplitStringAlongWhitespaceT(const STR& str, std::vector<STR>* result) { const size_t length = str.length(); if (!length) return; @@ -1310,6 +1310,16 @@ void SplitStringAlongWhitespace(const std::wstring& str, } } +void SplitStringAlongWhitespace(const std::wstring& str, + std::vector<std::wstring>* result) { + SplitStringAlongWhitespaceT(str, result); +} + +void SplitStringAlongWhitespace(const std::string& str, + std::vector<std::string>* result) { + SplitStringAlongWhitespaceT(str, result); +} + template<class StringType> StringType DoReplaceStringPlaceholders(const StringType& format_string, const std::vector<StringType>& subst, diff --git a/base/string_util.h b/base/string_util.h index c6b9fb1..5bacfcd 100644 --- a/base/string_util.h +++ b/base/string_util.h @@ -511,6 +511,8 @@ std::string JoinString(const std::vector<std::string>& parts, char s); // characters is added to result. void SplitStringAlongWhitespace(const std::wstring& str, std::vector<std::wstring>* result); +void SplitStringAlongWhitespace(const std::string& str, + std::vector<std::string>* result); // Replace $1-$2-$3..$9 in the format string with |a|-|b|-|c|..|i| respectively. // Additionally, $$ is replaced by $. The offsets parameter here can diff --git a/chrome/test/perf/mem_usage_linux.cc b/chrome/test/perf/mem_usage_linux.cc index 0d3b825..ec18d01 100644 --- a/chrome/test/perf/mem_usage_linux.cc +++ b/chrome/test/perf/mem_usage_linux.cc @@ -4,20 +4,73 @@ #include "chrome/test/perf/mem_usage.h" +#include "base/file_util.h" #include "base/logging.h" +#include "base/process_util.h" +#include "base/string_util.h" + +namespace { + +// The format of /proc/meminfo is: +// +// MemTotal: 8235324 kB +// MemFree: 1628304 kB +// Buffers: 429596 kB +// Cached: 4728232 kB +// ... +const size_t kMemTotalIndex = 1; +const size_t kMemFreeIndex = 4; +const size_t kMemBuffersIndex = 7; +const size_t kMemCacheIndex = 10; + +} // namespace bool GetMemoryInfo(uint32 process_id, size_t* peak_virtual_size, size_t* current_virtual_size, size_t* peak_working_set_size, size_t* current_working_set_size) { - NOTIMPLEMENTED(); - return false; + if (!peak_virtual_size || !current_virtual_size) + return false; + + base::ProcessMetrics* metrics = + base::ProcessMetrics::CreateProcessMetrics(process_id); + *peak_virtual_size = metrics->GetPeakPagefileUsage(); + *current_virtual_size = metrics->GetPagefileUsage(); + *peak_working_set_size = metrics->GetPeakWorkingSetSize(); + *current_working_set_size = metrics->GetWorkingSetSize(); + delete metrics; + + return true; } size_t GetSystemCommitCharge() { - NOTIMPLEMENTED(); - return 0; + // Used memory is: total - free - buffers - caches + FilePath meminfo_file("/proc/meminfo"); + std::string meminfo_data; + if (!file_util::ReadFileToString(meminfo_file, &meminfo_data)) + return 0; + std::vector<std::string> meminfo_fields; + SplitStringAlongWhitespace(meminfo_data, &meminfo_fields); + + if (meminfo_fields.size() < kMemCacheIndex) { + LOG(ERROR) << "Failed to parse /proc/meminfo. Only found " << + meminfo_fields.size() << " fields."; + return 0; + } + + DCHECK_EQ(meminfo_fields[kMemTotalIndex-1], "MemTotal:"); + DCHECK_EQ(meminfo_fields[kMemFreeIndex-1], "MemFree:"); + DCHECK_EQ(meminfo_fields[kMemBuffersIndex-1], "Buffers:"); + DCHECK_EQ(meminfo_fields[kMemCacheIndex-1], "Cached:"); + + int result_in_kb; + result_in_kb = StringToInt(meminfo_fields[kMemTotalIndex]); + result_in_kb -= StringToInt(meminfo_fields[kMemFreeIndex]); + result_in_kb -= StringToInt(meminfo_fields[kMemBuffersIndex]); + result_in_kb -= StringToInt(meminfo_fields[kMemCacheIndex]); + + return result_in_kb * 1024; } void PrintChromeMemoryUsageInfo() { |