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/malloc_dump_provider.h" | 5 #include "base/trace_event/malloc_dump_provider.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/allocator/allocator_extension.h" | 9 #include "base/allocator/allocator_extension.h" |
| 10 #include "base/allocator/allocator_shim.h" | 10 #include "base/allocator/allocator_shim.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 MallocDumpProvider::GetInstance()->RemoveAllocation(address); | 75 MallocDumpProvider::GetInstance()->RemoveAllocation(address); |
| 76 const AllocatorDispatch* const next = self->next; | 76 const AllocatorDispatch* const next = self->next; |
| 77 next->free_function(next, address); | 77 next->free_function(next, address); |
| 78 } | 78 } |
| 79 | 79 |
| 80 size_t HookGetSizeEstimate(const AllocatorDispatch* self, void* address) { | 80 size_t HookGetSizeEstimate(const AllocatorDispatch* self, void* address) { |
| 81 const AllocatorDispatch* const next = self->next; | 81 const AllocatorDispatch* const next = self->next; |
| 82 return next->get_size_estimate_function(next, address); | 82 return next->get_size_estimate_function(next, address); |
| 83 } | 83 } |
| 84 | 84 |
| 85 unsigned HookBatchMalloc(const AllocatorDispatch* self, | |
| 86 size_t size, | |
| 87 void** results, | |
| 88 unsigned num_requested) { | |
| 89 const AllocatorDispatch* const next = self->next; | |
| 90 unsigned count = | |
| 91 next->batch_malloc_function(next, size, results, num_requested); | |
| 92 for (unsigned i = 0; i < count; ++i) { | |
| 93 MallocDumpProvider::GetInstance()->InsertAllocation(results[i], size); | |
| 94 } | |
| 95 return count; | |
| 96 } | |
| 97 | |
| 98 void HookBatchFree(const AllocatorDispatch* self, | |
| 99 void** to_be_freed, | |
| 100 unsigned num_to_be_freed) { | |
| 101 const AllocatorDispatch* const next = self->next; | |
| 102 for (unsigned i = 0; i < num_to_be_freed; ++i) { | |
| 103 if (to_be_freed[i] != nullptr) { | |
|
Primiano Tucci (use gerrit)
2017/01/28 05:10:02
do you know if this will actually happen frequenty
erikchen
2017/01/31 02:21:22
*shrug*, okay. I was just mirroring the format of
| |
| 104 MallocDumpProvider::GetInstance()->RemoveAllocation(to_be_freed[i]); | |
| 105 } | |
| 106 } | |
| 107 next->batch_free_function(next, to_be_freed, num_to_be_freed); | |
| 108 } | |
| 109 | |
| 85 AllocatorDispatch g_allocator_hooks = { | 110 AllocatorDispatch g_allocator_hooks = { |
| 86 &HookAlloc, /* alloc_function */ | 111 &HookAlloc, /* alloc_function */ |
| 87 &HookZeroInitAlloc, /* alloc_zero_initialized_function */ | 112 &HookZeroInitAlloc, /* alloc_zero_initialized_function */ |
| 88 &HookllocAligned, /* alloc_aligned_function */ | 113 &HookllocAligned, /* alloc_aligned_function */ |
| 89 &HookRealloc, /* realloc_function */ | 114 &HookRealloc, /* realloc_function */ |
| 90 &HookFree, /* free_function */ | 115 &HookFree, /* free_function */ |
| 91 &HookGetSizeEstimate, /* get_size_estimate_function */ | 116 &HookGetSizeEstimate, /* get_size_estimate_function */ |
| 117 &HookBatchMalloc, /* get_size_estimate_function */ | |
| 118 &HookBatchFree, /* get_size_estimate_function */ | |
| 92 nullptr, /* next */ | 119 nullptr, /* next */ |
| 93 }; | 120 }; |
| 94 #endif // BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) | 121 #endif // BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) |
| 95 | 122 |
| 96 #if defined(OS_WIN) | 123 #if defined(OS_WIN) |
| 97 // A structure containing some information about a given heap. | 124 // A structure containing some information about a given heap. |
| 98 struct WinHeapInfo { | 125 struct WinHeapInfo { |
| 99 size_t committed_size; | 126 size_t committed_size; |
| 100 size_t uncommitted_size; | 127 size_t uncommitted_size; |
| 101 size_t allocated_size; | 128 size_t allocated_size; |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 316 tid_dumping_heap_ == PlatformThread::CurrentId()) | 343 tid_dumping_heap_ == PlatformThread::CurrentId()) |
| 317 return; | 344 return; |
| 318 AutoLock lock(allocation_register_lock_); | 345 AutoLock lock(allocation_register_lock_); |
| 319 if (!allocation_register_) | 346 if (!allocation_register_) |
| 320 return; | 347 return; |
| 321 allocation_register_->Remove(address); | 348 allocation_register_->Remove(address); |
| 322 } | 349 } |
| 323 | 350 |
| 324 } // namespace trace_event | 351 } // namespace trace_event |
| 325 } // namespace base | 352 } // namespace base |
| OLD | NEW |