Chromium Code Reviews| Index: base/debug/thread_heap_usage_tracker.cc |
| diff --git a/base/debug/thread_heap_usage_tracker.cc b/base/debug/thread_heap_usage_tracker.cc |
| index b9018e0c7056e2aa578e1586c462e88f58ea4008..ab8f5abf38d1068b8ee7036235ed05075b892533 100644 |
| --- a/base/debug/thread_heap_usage_tracker.cc |
| +++ b/base/debug/thread_heap_usage_tracker.cc |
| @@ -144,7 +144,12 @@ ThreadHeapUsage* GetOrCreateThreadUsage() { |
| // Prevent reentrancy due to the allocation below. |
| g_thread_allocator_usage.Set(kInitializingSentinel); |
| - allocator_usage = new ThreadHeapUsage; |
| + // Delegate the allocation of the per-thread structure to the underlying |
| + // heap shim, for symmetry with the deallocation. Otherwise interposing |
| + // shims may mis-attribute or mis-direct this allocation. |
| + const AllocatorDispatch* next = allocator_dispatch.next; |
|
Primiano Tucci (use gerrit)
2016/11/28 18:38:31
add a compile_assert(std::is_pod(ThreadHeapUsage))
Sigurður Ásgeirsson
2016/11/30 14:41:14
Got one of those down a couple of lines, added ano
|
| + allocator_usage = static_cast<ThreadHeapUsage*>( |
| + next->alloc_function(next, sizeof(ThreadHeapUsage))); |
|
Primiano Tucci (use gerrit)
2016/11/28 18:38:31
maybe a placement new is slighlty cleaner here.
I
Sigurður Ásgeirsson
2016/11/30 14:41:14
Ah, placement new - cool - haven't used it for thi
|
| memset(allocator_usage, 0, sizeof(*allocator_usage)); |
| g_thread_allocator_usage.Set(allocator_usage); |
| } |
| @@ -159,7 +164,10 @@ ThreadHeapUsageTracker::ThreadHeapUsageTracker() : thread_usage_(nullptr) { |
| } |
| ThreadHeapUsageTracker::~ThreadHeapUsageTracker() { |
| - DCHECK(thread_checker_.CalledOnValidThread()); |
| + // TODO(fdoray): This DCHECK causes inexplicable fallout in Chrome. This |
| + // was isolated to a line in CalledOnValidThread reading. |
| + // if (task_token_ == TaskToken::GetForCurrentThread()) |
| + // DCHECK(thread_checker_.CalledOnValidThread()); |
| if (thread_usage_ != nullptr) { |
| // If this tracker wasn't stopped, make it inclusive so that the |
| @@ -254,7 +262,11 @@ ThreadHeapUsageTracker::GetDispatchForTesting() { |
| void ThreadHeapUsageTracker::EnsureTLSInitialized() { |
| if (!g_thread_allocator_usage.initialized()) { |
| g_thread_allocator_usage.Initialize([](void* allocator_usage) { |
| - delete static_cast<ThreadHeapUsage*>(allocator_usage); |
| + // Delegate the freeing of the per-thread structure to the next-lower |
| + // heap shim. Otherwise this free will re-initialize the TLS on thread |
| + // exit. |
| + allocator_dispatch.next->free_function(allocator_dispatch.next, |
| + allocator_usage); |
| }); |
| } |
| } |