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 |