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 0ec007e2ee46f5140bf83ee5580a7f5c1ee221f4..86026070941d1b1248c714d01500008f80ca0973 100644 |
| --- a/base/trace_event/process_memory_dump.cc |
| +++ b/base/trace_event/process_memory_dump.cc |
| @@ -30,8 +30,10 @@ std::string GetSharedGlobalAllocatorDumpName( |
| #if defined(COUNT_RESIDENT_BYTES_SUPPORTED) |
| // static |
| -size_t ProcessMemoryDump::CountResidentBytes(void* start_address, |
| - size_t mapped_size) { |
| +bool ProcessMemoryDump::CountResidentBytes(void* start_address, |
| + size_t mapped_size, |
| + size_t* resident_size) { |
| + *resident_size = 0; |
| const size_t page_size = GetPageSize(); |
| const uintptr_t start_pointer = reinterpret_cast<uintptr_t>(start_address); |
| DCHECK_EQ(0u, start_pointer % page_size); |
| @@ -42,7 +44,6 @@ size_t ProcessMemoryDump::CountResidentBytes(void* start_address, |
| // kPageChunkSize / page_size. |
| const size_t kMaxChunkSize = 32 * 1024 * 1024; |
| size_t offset = 0; |
| - size_t total_resident_size = 0; |
| while (offset < mapped_size) { |
| void* chunk_start = reinterpret_cast<void*>(start_pointer + offset); |
| const size_t chunk_size = std::min(mapped_size - offset, kMaxChunkSize); |
| @@ -52,21 +53,29 @@ size_t ProcessMemoryDump::CountResidentBytes(void* start_address, |
| #if defined(OS_MACOSX) || defined(OS_IOS) |
| std::vector<char> vec(page_count + 1); |
| int res = mincore(chunk_start, chunk_size, vector_as_array(&vec)); |
| - DCHECK(!res); |
| + if (res) |
| + return false; |
| + |
| for (size_t i = 0; i < page_count; i++) |
| resident_page_count += vec[i] & MINCORE_INCORE ? 1 : 0; |
| #else // defined(OS_MACOSX) || defined(OS_IOS) |
| std::vector<unsigned char> vec(page_count + 1); |
| - int res = mincore(chunk_start, chunk_size, vector_as_array(&vec)); |
| - DCHECK(!res); |
| + int error_counter = 0; |
| + int res = 0; |
| + do { |
|
reveman
2015/10/14 12:31:28
why do we allow retries here but not above?
Primiano Tucci (use gerrit)
2015/10/14 12:41:33
I guess because mac's manpage for mincore says it
ssid
2015/10/14 12:44:29
yes.
reveman
2015/10/14 13:03:53
Got it. Maybe add a comment here or above to expla
ssid
2015/10/14 13:35:55
Done.
|
| + res = mincore(chunk_start, chunk_size, vector_as_array(&vec)); |
| + } while (res == -1 && errno == EAGAIN && error_counter++ < 100); |
|
Primiano Tucci (use gerrit)
2015/10/14 11:27:08
i'd cap this at 3. Typically either this is a temp
ssid
2015/10/14 12:44:29
Added comment why it is 100.
reveman
2015/10/14 13:03:53
is it worth retrying at all?
ssid
2015/10/14 13:35:55
That is how eagain is handled in code. Like in cas
reveman
2015/10/14 14:17:11
Most of the EAGAIN code I see in the chromium code
|
| + if (res) |
| + return false; |
| + |
| for (size_t i = 0; i < page_count; i++) |
| resident_page_count += vec[i]; |
| #endif // defined(OS_MACOSX) || defined(OS_IOS) |
| - total_resident_size += resident_page_count * page_size; |
| + *resident_size += resident_page_count * page_size; |
| offset += kMaxChunkSize; |
| } |
| - return total_resident_size; |
| + return true; |
| } |
| #endif // defined(COUNT_RESIDENT_BYTES_SUPPORTED) |