Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: base/trace_event/heap_profiler_allocation_context_tracker.cc

Issue 1784133002: [tracing] Adding task information to heap profiler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use SetThreadName function. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/heap_profiler_allocation_context_tracker.h" 5 #include "base/trace_event/heap_profiler_allocation_context_tracker.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 9
10 #include "base/atomicops.h" 10 #include "base/atomicops.h"
(...skipping 14 matching lines...) Expand all
25 ThreadLocalStorage::StaticSlot g_tls_alloc_ctx_tracker = TLS_INITIALIZER; 25 ThreadLocalStorage::StaticSlot g_tls_alloc_ctx_tracker = TLS_INITIALIZER;
26 26
27 // This function is added to the TLS slot to clean up the instance when the 27 // This function is added to the TLS slot to clean up the instance when the
28 // thread exits. 28 // thread exits.
29 void DestructAllocationContextTracker(void* alloc_ctx_tracker) { 29 void DestructAllocationContextTracker(void* alloc_ctx_tracker) {
30 delete static_cast<AllocationContextTracker*>(alloc_ctx_tracker); 30 delete static_cast<AllocationContextTracker*>(alloc_ctx_tracker);
31 } 31 }
32 32
33 } // namespace 33 } // namespace
34 34
35 AllocationContextTracker::AllocationContextTracker() { 35 AllocationContextTracker::AllocationContextTracker()
36 : current_task_file_name_(nullptr) {
36 pseudo_stack_.reserve(kMaxStackDepth); 37 pseudo_stack_.reserve(kMaxStackDepth);
37 } 38 }
39
38 AllocationContextTracker::~AllocationContextTracker() {} 40 AllocationContextTracker::~AllocationContextTracker() {}
39 41
40 // static 42 // static
41 AllocationContextTracker::InitializationState 43 AllocationContextTracker::InitializationState
42 AllocationContextTracker::GetStateForCurrentThread() { 44 AllocationContextTracker::GetStateForCurrentThread() {
43 auto tracker = 45 auto tracker =
44 static_cast<AllocationContextTracker*>(g_tls_alloc_ctx_tracker.Get()); 46 static_cast<AllocationContextTracker*>(g_tls_alloc_ctx_tracker.Get());
45 if (!tracker) 47 if (!tracker)
46 return kNotInitialized; 48 return kNotInitialized;
47 if (tracker == kInitializingSentinel) 49 if (tracker == kInitializingSentinel)
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 // Assert that pushes and pops are nested correctly. This DCHECK can be 108 // Assert that pushes and pops are nested correctly. This DCHECK can be
107 // hit if some TRACE_EVENT macro is unbalanced (a TRACE_EVENT_END* call 109 // hit if some TRACE_EVENT macro is unbalanced (a TRACE_EVENT_END* call
108 // without a corresponding TRACE_EVENT_BEGIN). 110 // without a corresponding TRACE_EVENT_BEGIN).
109 DCHECK_EQ(frame, tracker->pseudo_stack_.back()) 111 DCHECK_EQ(frame, tracker->pseudo_stack_.back())
110 << "Encountered an unmatched TRACE_EVENT_END"; 112 << "Encountered an unmatched TRACE_EVENT_END";
111 113
112 tracker->pseudo_stack_.pop_back(); 114 tracker->pseudo_stack_.pop_back();
113 } 115 }
114 116
115 // static 117 // static
118 void AllocationContextTracker::SetThreadName(const char* name) {
119 auto tracker = AllocationContextTracker::GetThreadLocalTracker();
120 CHECK(tracker);
Primiano Tucci (use gerrit) 2016/03/15 16:44:33 NO need for this CHECK. If tracker is nullptr, thi
ssid 2016/03/17 00:11:47 Done.
121
122 // The thread name is added as the first entry in the psuedo stack. This is
123 // not removed until the tls is destroyed when thread dies.
124 tracker->pseudo_stack_.insert(tracker->pseudo_stack_.begin(),
125 static_cast<StackFrame>(name));
126 }
127
128 // static
129 void AllocationContextTracker::SetCurrentTaskFileName(const char* file_name) {
130 AllocationContextTracker* tracker = GetThreadLocalTracker();
131 CHECK(tracker);
132 tracker->current_task_file_name_ = file_name;
133 }
134
135 // static
116 AllocationContext AllocationContextTracker::GetContextSnapshot() { 136 AllocationContext AllocationContextTracker::GetContextSnapshot() {
117 AllocationContextTracker* tracker = GetThreadLocalTracker(); 137 AllocationContextTracker* tracker = GetThreadLocalTracker();
118 AllocationContext ctx; 138 AllocationContext ctx;
119 139
120 // Fill the backtrace. 140 // Fill the backtrace.
121 { 141 {
122 auto src = tracker->pseudo_stack_.begin(); 142 auto src = tracker->pseudo_stack_.begin();
123 auto dst = std::begin(ctx.backtrace.frames); 143 auto dst = std::begin(ctx.backtrace.frames);
124 auto src_end = tracker->pseudo_stack_.end(); 144 auto src_end = tracker->pseudo_stack_.end();
125 auto dst_end = std::end(ctx.backtrace.frames); 145 auto dst_end = std::end(ctx.backtrace.frames);
126 146
127 // Copy as much of the bottom of the pseudo stack into the backtrace as 147 // Copy as much of the bottom of the pseudo stack into the backtrace as
128 // possible. 148 // possible.
129 for (; src != src_end && dst != dst_end; src++, dst++) 149 for (; src != src_end && dst != dst_end; src++, dst++)
130 *dst = *src; 150 *dst = *src;
131 151
132 // If there is room for more, fill the remaining slots with empty frames. 152 // If there is room for more, fill the remaining slots with empty frames.
133 std::fill(dst, dst_end, nullptr); 153 std::fill(dst, dst_end, nullptr);
134 } 154 }
135 155
136 ctx.type_name = nullptr; 156 // Set the default type name to file name where the task was posted from.
Primiano Tucci (use gerrit) 2016/03/15 16:44:33 Can you add a TODO: this should be a 3rd dimension
ssid 2016/03/17 00:11:47 Done.
157 // Trace viewer uses the file name to categorize allocation by file name.
158 ctx.type_name = tracker->current_task_file_name_;
137 159
138 return ctx; 160 return ctx;
139 } 161 }
140 162
141 } // namespace trace_event 163 } // namespace trace_event
142 } // namespace base 164 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698