Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/trace_event/process_memory_dump.h" | 5 #include "base/trace_event/process_memory_dump.h" |
| 6 | 6 |
| 7 #include "base/trace_event/process_memory_totals.h" | 7 #include "base/trace_event/process_memory_totals.h" |
| 8 #include "base/trace_event/trace_event_argument.h" | 8 #include "base/trace_event/trace_event_argument.h" |
| 9 | 9 |
| 10 #if defined(OS_POSIX) | |
| 11 #include <sys/mman.h> | |
| 12 #endif | |
| 13 | |
| 10 namespace base { | 14 namespace base { |
| 11 namespace trace_event { | 15 namespace trace_event { |
| 12 | 16 |
| 13 namespace { | 17 namespace { |
| 14 const char kEdgeTypeOwnership[] = "ownership"; | 18 const char kEdgeTypeOwnership[] = "ownership"; |
| 15 | 19 |
| 16 std::string GetSharedGlobalAllocatorDumpName( | 20 std::string GetSharedGlobalAllocatorDumpName( |
| 17 const MemoryAllocatorDumpGuid& guid) { | 21 const MemoryAllocatorDumpGuid& guid) { |
| 18 return "global/" + guid.ToString(); | 22 return "global/" + guid.ToString(); |
| 19 } | 23 } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 AddOwnershipEdge(source, target, 0 /* importance */); | 157 AddOwnershipEdge(source, target, 0 /* importance */); |
| 154 } | 158 } |
| 155 | 159 |
| 156 void ProcessMemoryDump::AddSuballocation(const MemoryAllocatorDumpGuid& source, | 160 void ProcessMemoryDump::AddSuballocation(const MemoryAllocatorDumpGuid& source, |
| 157 const std::string& target_node_name) { | 161 const std::string& target_node_name) { |
| 158 std::string child_mad_name = target_node_name + "/__" + source.ToString(); | 162 std::string child_mad_name = target_node_name + "/__" + source.ToString(); |
| 159 MemoryAllocatorDump* target_child_mad = CreateAllocatorDump(child_mad_name); | 163 MemoryAllocatorDump* target_child_mad = CreateAllocatorDump(child_mad_name); |
| 160 AddOwnershipEdge(source, target_child_mad->guid()); | 164 AddOwnershipEdge(source, target_child_mad->guid()); |
| 161 } | 165 } |
| 162 | 166 |
| 167 // static | |
| 168 ssize_t ProcessMemoryDump::CountResidentBytes(void* start_address, | |
| 169 size_t mapped_size) { | |
| 170 #if defined(OS_POSIX) | |
| 171 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.
| |
| 172 DCHECK_EQ(0u, (reinterpret_cast<uintptr_t>(start_address) % page_size)); | |
| 173 const size_t page_count = (mapped_size + page_size - 1) / page_size; | |
| 174 #if defined(OS_LINUX) || defined(OS_ANDROID) | |
| 175 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.
| |
| 176 int res = | |
| 177 mincore(start_address, mapped_size, static_cast<unsigned char*>(vec)); | |
| 178 #else // defined(OS_LINUX) || defined(OS_ANDROID) | |
| 179 char vec[page_count + 1]; | |
| 180 int res = mincore(start_address, mapped_size, static_cast<char*>(vec)); | |
| 181 #endif // defined(OS_LINUX) || defined(OS_ANDROID) | |
| 182 | |
| 183 if (res) { | |
| 184 return -1; | |
| 185 } | |
| 186 | |
| 187 size_t resident_page_count = 0; | |
| 188 for (size_t i = 0; i < page_count; i++) { | |
| 189 #if defined(OS_LINUX) || defined(OS_ANDROID) | |
| 190 resident_page_count += vec[i]; | |
| 191 #else | |
| 192 resident_page_count += vec[i] & MINCORE_INCORE ? 1 : 0; | |
| 193 #endif // defined(OS_LINUX) || defined(OS_ANDROID) | |
| 194 } | |
| 195 return resident_page_count * page_size; | |
| 196 | |
| 197 #else // defined(OS_POSIX) | |
| 198 return -1; | |
| 199 #endif // defined(OS_POSIX) | |
| 200 } | |
| 201 | |
| 163 } // namespace trace_event | 202 } // namespace trace_event |
| 164 } // namespace base | 203 } // namespace base |
| OLD | NEW |