Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(610)

Unified Diff: base/trace_event/process_memory_dump.cc

Issue 1375963007: [tracing] Display the resident size of the discardable memory segments (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lock_discardable
Patch Set: Fix mac. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698