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: third_party/WebKit/Source/platform/TraceEvent.h

Issue 1850603002: [tracing] Use trace event profiling for heap profiling Base URL: https://chromium.googlesource.com/chromium/src.git@all_categories
Patch Set: Created 4 years, 8 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
« no previous file with comments | « third_party/WebKit/Source/platform/EventTracer.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 flags, ##__VA_ARGS__); \ 163 flags, ##__VA_ARGS__); \
164 } \ 164 } \
165 } while (0) 165 } while (0)
166 166
167 // Implementation detail: internal macro to create static category and add begin 167 // Implementation detail: internal macro to create static category and add begin
168 // event if the category is enabled. Also adds the end event when the scope 168 // event if the category is enabled. Also adds the end event when the scope
169 // ends. 169 // ends.
170 #define INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, ...) \ 170 #define INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, ...) \
171 INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ 171 INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
172 blink::TraceEvent::ScopedTracer INTERNALTRACEEVENTUID(scopedTracer); \ 172 blink::TraceEvent::ScopedTracer INTERNALTRACEEVENTUID(scopedTracer); \
173 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 173 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_TRACING()) { \
174 blink::TraceEvent::TraceEventHandle h = \ 174 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
175 blink::TraceEvent::addTraceEvent( \ 175 blink::TraceEvent::TraceEventHandle h = \
176 TRACE_EVENT_PHASE_COMPLETE, \ 176 blink::TraceEvent::addTraceEvent( \
177 INTERNALTRACEEVENTUID(categoryGroupEnabled), name, \ 177 TRACE_EVENT_PHASE_COMPLETE, \
178 blink::TraceEvent::kGlobalScope, blink::TraceEvent::noEventId, \ 178 INTERNALTRACEEVENTUID(categoryGroupEnabled), name, \
179 TRACE_EVENT_FLAG_NONE, ##__VA_ARGS__); \ 179 blink::TraceEvent::kGlobalScope, blink::TraceEvent::noEventI d, \
180 INTERNALTRACEEVENTUID(scopedTracer).initialize( \ 180 TRACE_EVENT_FLAG_NONE, ##__VA_ARGS__); \
181 INTERNALTRACEEVENTUID(categoryGroupEnabled), name, h); \ 181 INTERNALTRACEEVENTUID(scopedTracer).initialize( \
182 INTERNALTRACEEVENTUID(categoryGroupEnabled), name, h); \
183 } \
184 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_PROFILING()) { \
185 INTERNALTRACEEVENTUID(scopedTracer) \
186 .initializeForHeapProfiling(name, TRACE_EVENT_FLAG_NONE); \
187 } \
182 } 188 }
183 189
184 #define INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category, name, bindId, flowFl ags, ...) \ 190 #define INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category, name, bindId, flowFl ags, ...) \
185 INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ 191 INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
186 blink::TraceEvent::ScopedTracer INTERNALTRACEEVENTUID(scopedTracer); \ 192 blink::TraceEvent::ScopedTracer INTERNALTRACEEVENTUID(scopedTracer); \
187 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 193 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_TRACING()) { \
188 unsigned traceEventFlags = flowFlags; \ 194 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
189 blink::TraceEvent::TraceID traceEventBindId(bindId, &traceEventFlags); \ 195 unsigned traceEventFlags = flowFlags; \
190 blink::TraceEvent::TraceEventHandle h = \ 196 blink::TraceEvent::TraceID traceEventBindId(bindId, &traceEventFlags ); \
191 blink::TraceEvent::addTraceEvent( \ 197 blink::TraceEvent::TraceEventHandle h = \
192 TRACE_EVENT_PHASE_COMPLETE, \ 198 blink::TraceEvent::addTraceEvent( \
193 INTERNALTRACEEVENTUID(categoryGroupEnabled), name, \ 199 TRACE_EVENT_PHASE_COMPLETE, \
194 blink::TraceEvent::kGlobalScope, blink::TraceEvent::noEventId, \ 200 INTERNALTRACEEVENTUID(categoryGroupEnabled), name, \
195 traceEventBindId.data(), \ 201 blink::TraceEvent::kGlobalScope, blink::TraceEvent::noEventI d, \
196 EventTracer::systemTraceTime(), traceEventFlags, ##__VA_ARGS__); \ 202 traceEventBindId.data(), \
197 INTERNALTRACEEVENTUID(scopedTracer).initialize( \ 203 EventTracer::systemTraceTime(), traceEventFlags, ##__VA_ARGS __); \
198 INTERNALTRACEEVENTUID(categoryGroupEnabled), name, h); \ 204 INTERNALTRACEEVENTUID(scopedTracer).initialize( \
205 INTERNALTRACEEVENTUID(categoryGroupEnabled), name, h); \
206 } \
207 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_PROFILING()) { \
208 INTERNALTRACEEVENTUID(scopedTracer) \
209 .initializeForHeapProfiling(name, TRACE_EVENT_FLAG_NONE); \
210 } \
199 } 211 }
200 212
201 // Implementation detail: internal macro to create static category and add 213 // Implementation detail: internal macro to create static category and add
202 // event if the category is enabled. 214 // event if the category is enabled.
203 #define INTERNAL_TRACE_EVENT_ADD_WITH_ID(phase, category, name, id, flags, ...) \ 215 #define INTERNAL_TRACE_EVENT_ADD_WITH_ID(phase, category, name, id, flags, ...) \
204 do { \ 216 do { \
205 INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ 217 INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
206 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 218 if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
207 unsigned traceEventFlags = flags | TRACE_EVENT_FLAG_HAS_ID; \ 219 unsigned traceEventFlags = flags | TRACE_EVENT_FLAG_HAS_ID; \
208 blink::TraceEvent::TraceID traceEventTraceID( \ 220 blink::TraceEvent::TraceID traceEventTraceID( \
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 INTERNAL_TRACE_EVENT_UID(ScopedContext) \ 274 INTERNAL_TRACE_EVENT_UID(ScopedContext) \
263 (const INTERNAL_TRACE_EVENT_UID(ScopedContext)&) {}; \ 275 (const INTERNAL_TRACE_EVENT_UID(ScopedContext)&) {}; \
264 void operator=(const INTERNAL_TRACE_EVENT_UID(ScopedContext)&) {}; \ 276 void operator=(const INTERNAL_TRACE_EVENT_UID(ScopedContext)&) {}; \
265 }; \ 277 }; \
266 INTERNAL_TRACE_EVENT_UID(ScopedContext) \ 278 INTERNAL_TRACE_EVENT_UID(ScopedContext) \
267 INTERNAL_TRACE_EVENT_UID(scoped_context)(context.data()); 279 INTERNAL_TRACE_EVENT_UID(scoped_context)(context.data());
268 280
269 // These values must be in sync with base::debug::TraceLog::CategoryGroupEnabled Flags. 281 // These values must be in sync with base::debug::TraceLog::CategoryGroupEnabled Flags.
270 #define ENABLED_FOR_RECORDING (1 << 0) 282 #define ENABLED_FOR_RECORDING (1 << 0)
271 #define ENABLED_FOR_EVENT_CALLBACK (1 << 2) 283 #define ENABLED_FOR_EVENT_CALLBACK (1 << 2)
284 #define ENABLED_FOR_ETW_EXPORT (1 << 3)
285 #define ENABLED_FOR_PROFILING (1 << 4)
286 #define ENABLED_FOR_NON_PROFILING_MODE (ENABLED_FOR_RECORDING | ENABLED_FOR_EVEN T_CALLBACK | ENABLED_FOR_ETW_EXPORT)
287
288 #define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_TRACING() \
289 (*INTERNALTRACEEVENTUID(categoryGroupEnabled) & (ENABLED_FOR_PROFILING | ENA BLED_FOR_NON_PROFILING_MODE))
272 290
273 #define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE() \ 291 #define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE() \
274 (*INTERNALTRACEEVENTUID(categoryGroupEnabled) & (ENABLED_FOR_RECORDING | ENA BLED_FOR_EVENT_CALLBACK)) 292 (*INTERNALTRACEEVENTUID(categoryGroupEnabled) & ENABLED_FOR_NON_PROFILING_MO DE)
293
294 #define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_PROFILING() \
295 (*INTERNALTRACEEVENTUID(categoryGroupEnabled) & ENABLED_FOR_PROFILING)
275 296
276 #define INTERNAL_TRACE_MEMORY(category, name) 297 #define INTERNAL_TRACE_MEMORY(category, name)
277 298
278 namespace blink { 299 namespace blink {
279 300
280 namespace TraceEvent { 301 namespace TraceEvent {
281 302
282 // Specify these values when the corresponding argument of addTraceEvent is not 303 // Specify these values when the corresponding argument of addTraceEvent is not
283 // used. 304 // used.
284 const int zeroNumArgs = 0; 305 const int zeroNumArgs = 0;
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 615
595 // Used by TRACE_EVENTx macro. Do not use directly. 616 // Used by TRACE_EVENTx macro. Do not use directly.
596 class ScopedTracer final { 617 class ScopedTracer final {
597 STACK_ALLOCATED(); 618 STACK_ALLOCATED();
598 WTF_MAKE_NONCOPYABLE(ScopedTracer); 619 WTF_MAKE_NONCOPYABLE(ScopedTracer);
599 public: 620 public:
600 // Note: members of m_data intentionally left uninitialized. See initialize. 621 // Note: members of m_data intentionally left uninitialized. See initialize.
601 ScopedTracer() : m_pdata(0) { } 622 ScopedTracer() : m_pdata(0) { }
602 ~ScopedTracer() 623 ~ScopedTracer()
603 { 624 {
604 if (m_pdata && *m_pdata->categoryGroupEnabled) 625 if (m_data.name) {
605 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(m_data.categoryGroupEnab led, m_data.name, m_data.eventHandle); 626 if (m_data.initializedForProfiling)
627 blink::EventTracer::pushPseudoStackFrame(m_data.name);
628 if (m_pdata && *m_pdata->categoryGroupEnabled)
629 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(m_data.categoryGroup Enabled, m_data.name, m_data.eventHandle);
630 }
606 } 631 }
607 632
608 void initialize(const unsigned char* categoryGroupEnabled, const char* name, TraceEventHandle eventHandle) 633 void initialize(const unsigned char* categoryGroupEnabled, const char* name, TraceEventHandle eventHandle)
609 { 634 {
610 m_data.categoryGroupEnabled = categoryGroupEnabled; 635 m_data.categoryGroupEnabled = categoryGroupEnabled;
611 m_data.name = name; 636 m_data.name = name;
612 m_data.eventHandle = eventHandle; 637 m_data.eventHandle = eventHandle;
613 m_pdata = &m_data; 638 m_pdata = &m_data;
614 } 639 }
615 640
641 void initializeForHeapProfiling(const char* name, unsigned flags)
642 {
643 if (!(flags & TRACE_EVENT_FLAG_COPY)) {
644 m_data.initializedForProfiling = true;
645 m_data.name = name;
646 blink::EventTracer::pushPseudoStackFrame(name);
647 }
648 }
649
616 private: 650 private:
617 // This Data struct workaround is to avoid initializing all the members 651 // This Data struct workaround is to avoid initializing all the members
618 // in Data during construction of this object, since this object is always 652 // in Data during construction of this object, since this object is always
619 // constructed, even when tracing is disabled. If the members of Data were 653 // constructed, even when tracing is disabled. If the members of Data were
620 // members of this class instead, compiler warnings occur about potential 654 // members of this class instead, compiler warnings occur about potential
621 // uninitialized accesses. 655 // uninitialized accesses.
622 struct Data { 656 struct Data {
623 DISALLOW_NEW(); 657 DISALLOW_NEW();
624 const unsigned char* categoryGroupEnabled; 658 const unsigned char* categoryGroupEnabled;
625 const char* name; 659 const char* name;
626 TraceEventHandle eventHandle; 660 TraceEventHandle eventHandle;
661 bool initializedForProfiling;
627 }; 662 };
628 Data* m_pdata; 663 Data* m_pdata;
629 Data m_data; 664 Data m_data;
630 }; 665 };
631 666
632 // TraceEventSamplingStateScope records the current sampling state 667 // TraceEventSamplingStateScope records the current sampling state
633 // and sets a new sampling state. When the scope exists, it restores 668 // and sets a new sampling state. When the scope exists, it restores
634 // the sampling state having recorded. 669 // the sampling state having recorded.
635 template<size_t BucketNumber> 670 template<size_t BucketNumber>
636 class SamplingStateScope final { 671 class SamplingStateScope final {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 const char* m_categoryGroup; 716 const char* m_categoryGroup;
682 const char* m_name; 717 const char* m_name;
683 IDType m_id; 718 IDType m_id;
684 }; 719 };
685 720
686 } // namespace TraceEvent 721 } // namespace TraceEvent
687 722
688 } // namespace blink 723 } // namespace blink
689 724
690 #endif 725 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/EventTracer.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698