| 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 <errno.h> | 7 #include <errno.h> |
| 8 |
| 8 #include <vector> | 9 #include <vector> |
| 9 | 10 |
| 11 #include "base/memory/ptr_util.h" |
| 10 #include "base/process/process_metrics.h" | 12 #include "base/process/process_metrics.h" |
| 11 #include "base/trace_event/process_memory_totals.h" | 13 #include "base/trace_event/process_memory_totals.h" |
| 12 #include "base/trace_event/trace_event_argument.h" | 14 #include "base/trace_event/trace_event_argument.h" |
| 13 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 14 | 16 |
| 15 #if defined(OS_IOS) | 17 #if defined(OS_IOS) |
| 16 #include <sys/sysctl.h> | 18 #include <sys/sysctl.h> |
| 17 #endif | 19 #endif |
| 18 | 20 |
| 19 #if defined(OS_POSIX) | 21 #if defined(OS_POSIX) |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 size_t total_resident_size = 0; | 77 size_t total_resident_size = 0; |
| 76 bool failure = false; | 78 bool failure = false; |
| 77 | 79 |
| 78 // An array as large as number of pages in memory segment needs to be passed | 80 // An array as large as number of pages in memory segment needs to be passed |
| 79 // to the query function. To avoid allocating a large array, the given block | 81 // to the query function. To avoid allocating a large array, the given block |
| 80 // of memory is split into chunks of size |kMaxChunkSize|. | 82 // of memory is split into chunks of size |kMaxChunkSize|. |
| 81 const size_t kMaxChunkSize = 8 * 1024 * 1024; | 83 const size_t kMaxChunkSize = 8 * 1024 * 1024; |
| 82 size_t max_vec_size = | 84 size_t max_vec_size = |
| 83 GetSystemPageCount(std::min(mapped_size, kMaxChunkSize), page_size); | 85 GetSystemPageCount(std::min(mapped_size, kMaxChunkSize), page_size); |
| 84 #if defined(OS_MACOSX) || defined(OS_IOS) | 86 #if defined(OS_MACOSX) || defined(OS_IOS) |
| 85 scoped_ptr<char[]> vec(new char[max_vec_size]); | 87 std::unique_ptr<char[]> vec(new char[max_vec_size]); |
| 86 #elif defined(OS_WIN) | 88 #elif defined(OS_WIN) |
| 87 scoped_ptr<PSAPI_WORKING_SET_EX_INFORMATION[]> vec( | 89 std::unique_ptr<PSAPI_WORKING_SET_EX_INFORMATION[]> vec( |
| 88 new PSAPI_WORKING_SET_EX_INFORMATION[max_vec_size]); | 90 new PSAPI_WORKING_SET_EX_INFORMATION[max_vec_size]); |
| 89 #elif defined(OS_POSIX) | 91 #elif defined(OS_POSIX) |
| 90 scoped_ptr<unsigned char[]> vec(new unsigned char[max_vec_size]); | 92 std::unique_ptr<unsigned char[]> vec(new unsigned char[max_vec_size]); |
| 91 #endif | 93 #endif |
| 92 | 94 |
| 93 while (offset < mapped_size) { | 95 while (offset < mapped_size) { |
| 94 uintptr_t chunk_start = (start_pointer + offset); | 96 uintptr_t chunk_start = (start_pointer + offset); |
| 95 const size_t chunk_size = std::min(mapped_size - offset, kMaxChunkSize); | 97 const size_t chunk_size = std::min(mapped_size - offset, kMaxChunkSize); |
| 96 const size_t page_count = GetSystemPageCount(chunk_size, page_size); | 98 const size_t page_count = GetSystemPageCount(chunk_size, page_size); |
| 97 size_t resident_page_count = 0; | 99 size_t resident_page_count = 0; |
| 98 | 100 |
| 99 #if defined(OS_MACOSX) || defined(OS_IOS) | 101 #if defined(OS_MACOSX) || defined(OS_IOS) |
| 100 // mincore in MAC does not fail with EAGAIN. | 102 // mincore in MAC does not fail with EAGAIN. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 scoped_refptr<MemoryDumpSessionState> session_state) | 149 scoped_refptr<MemoryDumpSessionState> session_state) |
| 148 : has_process_totals_(false), | 150 : has_process_totals_(false), |
| 149 has_process_mmaps_(false), | 151 has_process_mmaps_(false), |
| 150 session_state_(std::move(session_state)) {} | 152 session_state_(std::move(session_state)) {} |
| 151 | 153 |
| 152 ProcessMemoryDump::~ProcessMemoryDump() {} | 154 ProcessMemoryDump::~ProcessMemoryDump() {} |
| 153 | 155 |
| 154 MemoryAllocatorDump* ProcessMemoryDump::CreateAllocatorDump( | 156 MemoryAllocatorDump* ProcessMemoryDump::CreateAllocatorDump( |
| 155 const std::string& absolute_name) { | 157 const std::string& absolute_name) { |
| 156 return AddAllocatorDumpInternal( | 158 return AddAllocatorDumpInternal( |
| 157 make_scoped_ptr(new MemoryAllocatorDump(absolute_name, this))); | 159 base::WrapUnique(new MemoryAllocatorDump(absolute_name, this))); |
| 158 } | 160 } |
| 159 | 161 |
| 160 MemoryAllocatorDump* ProcessMemoryDump::CreateAllocatorDump( | 162 MemoryAllocatorDump* ProcessMemoryDump::CreateAllocatorDump( |
| 161 const std::string& absolute_name, | 163 const std::string& absolute_name, |
| 162 const MemoryAllocatorDumpGuid& guid) { | 164 const MemoryAllocatorDumpGuid& guid) { |
| 163 return AddAllocatorDumpInternal( | 165 return AddAllocatorDumpInternal( |
| 164 make_scoped_ptr(new MemoryAllocatorDump(absolute_name, this, guid))); | 166 base::WrapUnique(new MemoryAllocatorDump(absolute_name, this, guid))); |
| 165 } | 167 } |
| 166 | 168 |
| 167 MemoryAllocatorDump* ProcessMemoryDump::AddAllocatorDumpInternal( | 169 MemoryAllocatorDump* ProcessMemoryDump::AddAllocatorDumpInternal( |
| 168 scoped_ptr<MemoryAllocatorDump> mad) { | 170 std::unique_ptr<MemoryAllocatorDump> mad) { |
| 169 auto insertion_result = allocator_dumps_.insert( | 171 auto insertion_result = allocator_dumps_.insert( |
| 170 std::make_pair(mad->absolute_name(), std::move(mad))); | 172 std::make_pair(mad->absolute_name(), std::move(mad))); |
| 171 DCHECK(insertion_result.second) << "Duplicate name: " << mad->absolute_name(); | 173 DCHECK(insertion_result.second) << "Duplicate name: " << mad->absolute_name(); |
| 172 return insertion_result.first->second.get(); | 174 return insertion_result.first->second.get(); |
| 173 } | 175 } |
| 174 | 176 |
| 175 MemoryAllocatorDump* ProcessMemoryDump::GetAllocatorDump( | 177 MemoryAllocatorDump* ProcessMemoryDump::GetAllocatorDump( |
| 176 const std::string& absolute_name) const { | 178 const std::string& absolute_name) const { |
| 177 auto it = allocator_dumps_.find(absolute_name); | 179 auto it = allocator_dumps_.find(absolute_name); |
| 178 return it == allocator_dumps_.end() ? nullptr : it->second.get(); | 180 return it == allocator_dumps_.end() ? nullptr : it->second.get(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 207 mad->set_flags(MemoryAllocatorDump::Flags::WEAK); | 209 mad->set_flags(MemoryAllocatorDump::Flags::WEAK); |
| 208 return mad; | 210 return mad; |
| 209 } | 211 } |
| 210 | 212 |
| 211 MemoryAllocatorDump* ProcessMemoryDump::GetSharedGlobalAllocatorDump( | 213 MemoryAllocatorDump* ProcessMemoryDump::GetSharedGlobalAllocatorDump( |
| 212 const MemoryAllocatorDumpGuid& guid) const { | 214 const MemoryAllocatorDumpGuid& guid) const { |
| 213 return GetAllocatorDump(GetSharedGlobalAllocatorDumpName(guid)); | 215 return GetAllocatorDump(GetSharedGlobalAllocatorDumpName(guid)); |
| 214 } | 216 } |
| 215 | 217 |
| 216 void ProcessMemoryDump::AddHeapDump(const std::string& absolute_name, | 218 void ProcessMemoryDump::AddHeapDump(const std::string& absolute_name, |
| 217 scoped_ptr<TracedValue> heap_dump) { | 219 std::unique_ptr<TracedValue> heap_dump) { |
| 218 DCHECK_EQ(0ul, heap_dumps_.count(absolute_name)); | 220 DCHECK_EQ(0ul, heap_dumps_.count(absolute_name)); |
| 219 heap_dumps_[absolute_name] = std::move(heap_dump); | 221 heap_dumps_[absolute_name] = std::move(heap_dump); |
| 220 } | 222 } |
| 221 | 223 |
| 222 void ProcessMemoryDump::Clear() { | 224 void ProcessMemoryDump::Clear() { |
| 223 if (has_process_totals_) { | 225 if (has_process_totals_) { |
| 224 process_totals_.Clear(); | 226 process_totals_.Clear(); |
| 225 has_process_totals_ = false; | 227 has_process_totals_ = false; |
| 226 } | 228 } |
| 227 | 229 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 | 313 |
| 312 void ProcessMemoryDump::AddSuballocation(const MemoryAllocatorDumpGuid& source, | 314 void ProcessMemoryDump::AddSuballocation(const MemoryAllocatorDumpGuid& source, |
| 313 const std::string& target_node_name) { | 315 const std::string& target_node_name) { |
| 314 std::string child_mad_name = target_node_name + "/__" + source.ToString(); | 316 std::string child_mad_name = target_node_name + "/__" + source.ToString(); |
| 315 MemoryAllocatorDump* target_child_mad = CreateAllocatorDump(child_mad_name); | 317 MemoryAllocatorDump* target_child_mad = CreateAllocatorDump(child_mad_name); |
| 316 AddOwnershipEdge(source, target_child_mad->guid()); | 318 AddOwnershipEdge(source, target_child_mad->guid()); |
| 317 } | 319 } |
| 318 | 320 |
| 319 } // namespace trace_event | 321 } // namespace trace_event |
| 320 } // namespace base | 322 } // namespace base |
| OLD | NEW |