 Chromium Code Reviews
 Chromium Code Reviews Issue 2386123003:
  Add heap allocator usage to task profiler.  (Closed)
    
  
    Issue 2386123003:
  Add heap allocator usage to task profiler.  (Closed) 
  | 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); | 
| }); | 
| } | 
| } |