Chromium Code Reviews| Index: base/trace_event/process_memory_dump.cc |
| diff --git a/base/trace_event/process_memory_dump.cc b/base/trace_event/process_memory_dump.cc |
| index 67118f10e8c0604d6586b0c54e29497ef08c2242..597bc563cbf592de74395dc84ed32f5b1f9e576e 100644 |
| --- a/base/trace_event/process_memory_dump.cc |
| +++ b/base/trace_event/process_memory_dump.cc |
| @@ -7,6 +7,10 @@ |
| #include "base/trace_event/process_memory_totals.h" |
| #include "base/trace_event/trace_event_argument.h" |
| +#if defined(OS_POSIX) |
| +#include <sys/mman.h> |
| +#endif |
| + |
| namespace base { |
| namespace trace_event { |
| @@ -160,5 +164,40 @@ void ProcessMemoryDump::AddSuballocation(const MemoryAllocatorDumpGuid& source, |
| AddOwnershipEdge(source, target_child_mad->guid()); |
| } |
| +// static |
| +ssize_t ProcessMemoryDump::CountResidentBytes(void* start_address, |
| + size_t mapped_size) { |
| +#if defined(OS_POSIX) |
| + const size_t page_size = base::GetPageSize(); |
|
Primiano Tucci (use gerrit)
2015/10/06 17:14:09
I think we need to make this a bit smarter and ope
ssid
2015/10/07 09:13:19
Done.
|
| + DCHECK_EQ(0u, (reinterpret_cast<uintptr_t>(start_address) % page_size)); |
| + const size_t page_count = (mapped_size + page_size - 1) / page_size; |
| +#if defined(OS_LINUX) || defined(OS_ANDROID) |
| + unsigned char vec[page_count + 1]; |
|
Primiano Tucci (use gerrit)
2015/10/06 17:14:09
From [1]. "We do not allow variable-length arrays
ssid
2015/10/07 09:13:19
Done.
|
| + int res = |
| + mincore(start_address, mapped_size, static_cast<unsigned char*>(vec)); |
| +#else // defined(OS_LINUX) || defined(OS_ANDROID) |
| + char vec[page_count + 1]; |
| + int res = mincore(start_address, mapped_size, static_cast<char*>(vec)); |
| +#endif // defined(OS_LINUX) || defined(OS_ANDROID) |
| + |
| + if (res) { |
| + return -1; |
| + } |
| + |
| + size_t resident_page_count = 0; |
| + for (size_t i = 0; i < page_count; i++) { |
| +#if defined(OS_LINUX) || defined(OS_ANDROID) |
| + resident_page_count += vec[i]; |
| +#else |
| + resident_page_count += vec[i] & MINCORE_INCORE ? 1 : 0; |
| +#endif // defined(OS_LINUX) || defined(OS_ANDROID) |
| + } |
| + return resident_page_count * page_size; |
| + |
| +#else // defined(OS_POSIX) |
| + return -1; |
| +#endif // defined(OS_POSIX) |
| +} |
| + |
| } // namespace trace_event |
| } // namespace base |