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 2fbe531d551ab64cd1035c7b0c3ab7aeb9351f98..69244e4e1427785f80fba4e1c1cb9cc52b8ffa37 100644 |
| --- a/base/trace_event/process_memory_dump.cc |
| +++ b/base/trace_event/process_memory_dump.cc |
| @@ -12,6 +12,10 @@ |
| #include "base/trace_event/trace_event_argument.h" |
| #include "build/build_config.h" |
| +#if defined(OS_IOS) |
| +#include <sys/sysctl.h> |
| +#endif |
| + |
| #if defined(OS_POSIX) |
| #include <sys/mman.h> |
| #endif |
| @@ -42,9 +46,28 @@ size_t GetSystemPageCount(size_t mapped_size, size_t page_size) { |
| #if defined(COUNT_RESIDENT_BYTES_SUPPORTED) |
| // static |
| +size_t ProcessMemoryDump::GetSystemPageSize() { |
| +#if defined(OS_IOS) |
| + // On iOS, getpagesize() returns the user page sizes, but for allocating |
| + // arrays for mincore(), kernel page sizes is needed. sysctlbyname() should |
| + // be used for this. Refer to crbug.com/542671 and Apple rdar://23651782 |
| + int pagesize; |
| + size_t pagesize_len; |
| + int status = sysctlbyname("vm.pagesize", NULL, &pagesize_len, NULL, 0); |
|
Primiano Tucci (use gerrit)
2016/03/15 15:50:48
nit: s/NULL/nullptr
same below
pkl (ping after 24h if needed)
2016/03/16 14:24:21
Done.
|
| + if (!status && pagesize_len == sizeof(pagesize)) { |
| + if (sysctlbyname("vm.pagesize", &pagesize, &pagesize_len, NULL, 0) == 0) |
|
Primiano Tucci (use gerrit)
2016/03/15 15:50:48
nit: consistency, either you check the syscall ret
pkl (ping after 24h if needed)
2016/03/16 14:24:21
Yep, you're right. Thank you!
|
| + return pagesize; |
| + } |
| + LOG(ERROR) << "sysctlbyname(\"vm.pagesize\") failed."; |
| + // Falls back to getpagesize() although it may be wrong in certain cases. |
| +#endif // defined(OS_IOS) |
| + return base::GetPageSize(); |
| +} |
| + |
| +// static |
| size_t ProcessMemoryDump::CountResidentBytes(void* start_address, |
| size_t mapped_size) { |
| - const size_t page_size = GetPageSize(); |
| + const size_t page_size = GetSystemPageSize(); |
| const uintptr_t start_pointer = reinterpret_cast<uintptr_t>(start_address); |
| DCHECK_EQ(0u, start_pointer % page_size); |