| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/debug/thread_heap_usage_tracker.h" | 5 #include "base/debug/thread_heap_usage_tracker.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <new> | 9 #include <new> |
| 10 #include <type_traits> | 10 #include <type_traits> |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 void FreeFn(const AllocatorDispatch* self, void* address) { | 123 void FreeFn(const AllocatorDispatch* self, void* address) { |
| 124 if (address != nullptr) | 124 if (address != nullptr) |
| 125 RecordFree(self->next, address); | 125 RecordFree(self->next, address); |
| 126 self->next->free_function(self->next, address); | 126 self->next->free_function(self->next, address); |
| 127 } | 127 } |
| 128 | 128 |
| 129 size_t GetSizeEstimateFn(const AllocatorDispatch* self, void* address) { | 129 size_t GetSizeEstimateFn(const AllocatorDispatch* self, void* address) { |
| 130 return self->next->get_size_estimate_function(self->next, address); | 130 return self->next->get_size_estimate_function(self->next, address); |
| 131 } | 131 } |
| 132 | 132 |
| 133 unsigned BatchMallocFn(const AllocatorDispatch* self, |
| 134 size_t size, |
| 135 void** results, |
| 136 unsigned num_requested) { |
| 137 unsigned count = self->next->batch_malloc_function(self->next, size, results, |
| 138 num_requested); |
| 139 for (unsigned i = 0; i < count; ++i) { |
| 140 RecordAlloc(self->next, results[i], size); |
| 141 } |
| 142 return count; |
| 143 } |
| 144 |
| 145 void BatchFreeFn(const AllocatorDispatch* self, |
| 146 void** to_be_freed, |
| 147 unsigned num_to_be_freed) { |
| 148 for (unsigned i = 0; i < num_to_be_freed; ++i) { |
| 149 if (to_be_freed[i] != nullptr) { |
| 150 RecordFree(self->next, to_be_freed[i]); |
| 151 } |
| 152 } |
| 153 self->next->batch_free_function(self->next, to_be_freed, num_to_be_freed); |
| 154 } |
| 155 |
| 156 void FreeDefiniteSizeFn(const AllocatorDispatch* self, void* ptr, size_t size) { |
| 157 if (ptr != nullptr) |
| 158 RecordFree(self->next, ptr); |
| 159 self->next->free_definite_size_function(self->next, ptr, size); |
| 160 } |
| 161 |
| 133 // The allocator dispatch used to intercept heap operations. | 162 // The allocator dispatch used to intercept heap operations. |
| 134 AllocatorDispatch allocator_dispatch = { | 163 AllocatorDispatch allocator_dispatch = {&AllocFn, |
| 135 &AllocFn, &AllocZeroInitializedFn, &AllocAlignedFn, &ReallocFn, | 164 &AllocZeroInitializedFn, |
| 136 &FreeFn, &GetSizeEstimateFn, nullptr}; | 165 &AllocAlignedFn, |
| 166 &ReallocFn, |
| 167 &FreeFn, |
| 168 &GetSizeEstimateFn, |
| 169 &BatchMallocFn, |
| 170 &BatchFreeFn, |
| 171 &FreeDefiniteSizeFn, |
| 172 nullptr}; |
| 137 | 173 |
| 138 ThreadHeapUsage* GetOrCreateThreadUsage() { | 174 ThreadHeapUsage* GetOrCreateThreadUsage() { |
| 139 ThreadHeapUsage* allocator_usage = | 175 ThreadHeapUsage* allocator_usage = |
| 140 static_cast<ThreadHeapUsage*>(g_thread_allocator_usage.Get()); | 176 static_cast<ThreadHeapUsage*>(g_thread_allocator_usage.Get()); |
| 141 if (allocator_usage == kInitializingSentinel) | 177 if (allocator_usage == kInitializingSentinel) |
| 142 return nullptr; // Re-entrancy case. | 178 return nullptr; // Re-entrancy case. |
| 143 | 179 |
| 144 if (allocator_usage == nullptr) { | 180 if (allocator_usage == nullptr) { |
| 145 // Prevent reentrancy due to the allocation below. | 181 // Prevent reentrancy due to the allocation below. |
| 146 g_thread_allocator_usage.Set(kInitializingSentinel); | 182 g_thread_allocator_usage.Set(kInitializingSentinel); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 // heap shim. Otherwise this free will re-initialize the TLS on thread | 302 // heap shim. Otherwise this free will re-initialize the TLS on thread |
| 267 // exit. | 303 // exit. |
| 268 allocator_dispatch.next->free_function(allocator_dispatch.next, | 304 allocator_dispatch.next->free_function(allocator_dispatch.next, |
| 269 allocator_usage); | 305 allocator_usage); |
| 270 }); | 306 }); |
| 271 } | 307 } |
| 272 } | 308 } |
| 273 | 309 |
| 274 } // namespace debug | 310 } // namespace debug |
| 275 } // namespace base | 311 } // namespace base |
| OLD | NEW |