OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "base/debug/trace_event_win.h" | 4 #include "base/debug/trace_event_win.h" |
5 | 5 |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "base/memory/singleton.h" | 7 #include "base/memory/singleton.h" |
8 #include "base/strings/stringprintf.h" | |
8 #include <initguid.h> // NOLINT | 9 #include <initguid.h> // NOLINT |
9 | 10 |
10 namespace base { | 11 namespace base { |
11 namespace debug { | 12 namespace debug { |
12 | 13 |
13 using base::win::EtwEventType; | 14 using base::win::EtwEventType; |
14 using base::win::EtwMofEvent; | 15 using base::win::EtwMofEvent; |
15 | 16 |
16 // {3DADA31D-19EF-4dc1-B345-037927193422} | 17 // {3DADA31D-19EF-4dc1-B345-037927193422} |
17 const GUID kChromeTraceProviderName = { | 18 const GUID kChromeTraceProviderName = { |
(...skipping 26 matching lines...) Expand all Loading... | |
44 size_t name_len, | 45 size_t name_len, |
45 char type, | 46 char type, |
46 const void* id, | 47 const void* id, |
47 const char* extra, | 48 const char* extra, |
48 size_t extra_len) { | 49 size_t extra_len) { |
49 // Make sure we don't touch NULL. | 50 // Make sure we don't touch NULL. |
50 if (name == NULL) | 51 if (name == NULL) |
51 name = ""; | 52 name = ""; |
52 if (extra == NULL) | 53 if (extra == NULL) |
53 extra = ""; | 54 extra = ""; |
54 | |
55 EtwEventType etw_type = 0; | 55 EtwEventType etw_type = 0; |
56 switch (type) { | 56 switch (type) { |
57 case TRACE_EVENT_PHASE_BEGIN: | 57 case TRACE_EVENT_PHASE_BEGIN: |
58 case TRACE_EVENT_PHASE_ASYNC_BEGIN: | |
59 case TRACE_EVENT_PHASE_FLOW_BEGIN: | |
60 case TRACE_EVENT_PHASE_CREATE_OBJECT: | |
58 etw_type = kTraceEventTypeBegin; | 61 etw_type = kTraceEventTypeBegin; |
59 break; | 62 break; |
60 case TRACE_EVENT_PHASE_END: | 63 case TRACE_EVENT_PHASE_END: |
64 case TRACE_EVENT_PHASE_ASYNC_END: | |
65 case TRACE_EVENT_PHASE_FLOW_END: | |
66 case TRACE_EVENT_PHASE_DELETE_OBJECT: | |
61 etw_type = kTraceEventTypeEnd; | 67 etw_type = kTraceEventTypeEnd; |
62 break; | 68 break; |
63 | 69 |
64 case TRACE_EVENT_PHASE_INSTANT: | 70 case TRACE_EVENT_PHASE_INSTANT: |
71 case TRACE_EVENT_PHASE_INSTANT_OLD: | |
72 case TRACE_EVENT_PHASE_ASYNC_STEP: | |
73 case TRACE_EVENT_PHASE_FLOW_STEP: | |
74 case TRACE_EVENT_PHASE_METADATA: | |
75 case TRACE_EVENT_PHASE_COUNTER: | |
76 case TRACE_EVENT_PHASE_SAMPLE: | |
77 case TRACE_EVENT_PHASE_SNAPSHOT_OBJECT: | |
65 etw_type = kTraceEventTypeInstant; | 78 etw_type = kTraceEventTypeInstant; |
66 break; | 79 break; |
67 | 80 |
68 default: | 81 default: |
69 NOTREACHED() << "Unknown event type"; | 82 NOTREACHED() << "Unknown event type"; |
70 etw_type = kTraceEventTypeInstant; | 83 etw_type = kTraceEventTypeInstant; |
71 break; | 84 break; |
72 } | 85 } |
73 | 86 |
74 EtwMofEvent<5> event(kTraceEventClass32, | 87 EtwMofEvent<5> event(kTraceEventClass32, |
(...skipping 30 matching lines...) Expand all Loading... | |
105 // Compute the name & extra lengths if not supplied already. | 118 // Compute the name & extra lengths if not supplied already. |
106 if (name_len == -1) | 119 if (name_len == -1) |
107 name_len = (name == NULL) ? 0 : strlen(name); | 120 name_len = (name == NULL) ? 0 : strlen(name); |
108 if (extra_len == -1) | 121 if (extra_len == -1) |
109 extra_len = (extra == NULL) ? 0 : strlen(extra); | 122 extra_len = (extra == NULL) ? 0 : strlen(extra); |
110 | 123 |
111 provider->TraceEvent(name, name_len, type, id, extra, extra_len); | 124 provider->TraceEvent(name, name_len, type, id, extra, extra_len); |
112 } | 125 } |
113 } | 126 } |
114 | 127 |
128 void TraceEventETWProvider::TraceWithArgs( | |
129 const char* category_group, | |
130 const char* name, | |
131 char type, | |
132 const void* id, | |
133 int num_args, | |
134 const char** arg_names, | |
135 const unsigned char* arg_types, | |
136 const unsigned long long* arg_values, | |
137 scoped_ptr<ConvertableToTraceFormat> convertable_values[]) { | |
138 // Convert arguments to a string. | |
139 std::string extras = base::StringPrintf("[%s]", category_group); | |
140 for (int i = 0; i < num_args; ++i) { | |
141 if (i) | |
142 extras += ';'; | |
143 extras += arg_names[i]; | |
144 extras += '='; | |
145 std::string::size_type value_start = extras.length(); | |
146 if (arg_types[i] == TRACE_VALUE_TYPE_CONVERTABLE) { | |
147 convertable_values[i]->AppendAsTraceFormat(&extras); | |
148 } else { | |
149 base::debug::TraceEvent::TraceValue value; | |
150 value.as_uint = arg_values[i]; | |
151 base::debug::TraceEvent::AppendValueAsJSON(arg_types[i], value, &extras); | |
152 } | |
153 // Replace separator with a similar character. | |
154 std::replace(extras.begin() + value_start, extras.end(), ';', ','); | |
155 } | |
chrisha
2013/09/05 20:21:30
This string manipulation is relatively expensive.
fdoray
2013/09/08 18:35:50
The method is called for every event.
I wrapped t
| |
156 Trace(name, type, id, extras); | |
157 } | |
158 | |
115 void TraceEventETWProvider::Resurrect() { | 159 void TraceEventETWProvider::Resurrect() { |
116 StaticMemorySingletonTraits<TraceEventETWProvider>::Resurrect(); | 160 StaticMemorySingletonTraits<TraceEventETWProvider>::Resurrect(); |
117 } | 161 } |
118 | 162 |
119 } // namespace debug | 163 } // namespace debug |
120 } // namespace base | 164 } // namespace base |
OLD | NEW |