| 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 | 4 |
| 5 #ifndef BASE_TRACE_EVENT_TRACE_EVENT_H_ | 5 #ifndef BASE_TRACE_EVENT_TRACE_EVENT_H_ |
| 6 #define BASE_TRACE_EVENT_TRACE_EVENT_H_ | 6 #define BASE_TRACE_EVENT_TRACE_EVENT_H_ |
| 7 | 7 |
| 8 // This header file defines implementation details of how the trace macros in | 8 // This header file defines implementation details of how the trace macros in |
| 9 // trace_event_common.h collect and store trace events. Anything not | 9 // trace_event_common.h collect and store trace events. Anything not |
| 10 // implementation-specific should go in trace_event_common.h instead of here. | 10 // implementation-specific should go in trace_event_common.h instead of here. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 trace_event_internal::TraceID::DontMangle(id) | 42 trace_event_internal::TraceID::DontMangle(id) |
| 43 | 43 |
| 44 // By default, trace IDs are eventually converted to a single 64-bit number. Use | 44 // By default, trace IDs are eventually converted to a single 64-bit number. Use |
| 45 // this macro to add a scope string. | 45 // this macro to add a scope string. |
| 46 #define TRACE_ID_WITH_SCOPE(scope, id) \ | 46 #define TRACE_ID_WITH_SCOPE(scope, id) \ |
| 47 trace_event_internal::TraceID::WithScope(scope, id) | 47 trace_event_internal::TraceID::WithScope(scope, id) |
| 48 | 48 |
| 49 #define TRACE_ID_GLOBAL(id) trace_event_internal::TraceID::GlobalId(id) | 49 #define TRACE_ID_GLOBAL(id) trace_event_internal::TraceID::GlobalId(id) |
| 50 #define TRACE_ID_LOCAL(id) trace_event_internal::TraceID::LocalId(id) | 50 #define TRACE_ID_LOCAL(id) trace_event_internal::TraceID::LocalId(id) |
| 51 | 51 |
| 52 // Sets the current sample state to the given category and name (both must be | |
| 53 // constant strings). These states are intended for a sampling profiler. | |
| 54 // Implementation note: we store category and name together because we don't | |
| 55 // want the inconsistency/expense of storing two pointers. | |
| 56 // |thread_bucket| is [0..2] and is used to statically isolate samples in one | |
| 57 // thread from others. | |
| 58 #define TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET( \ | |
| 59 bucket_number, category, name) \ | |
| 60 trace_event_internal:: \ | |
| 61 TraceEventSamplingStateScope<bucket_number>::Set(category "\0" name) | |
| 62 | |
| 63 // Returns a current sampling state of the given bucket. | |
| 64 #define TRACE_EVENT_GET_SAMPLING_STATE_FOR_BUCKET(bucket_number) \ | |
| 65 trace_event_internal::TraceEventSamplingStateScope<bucket_number>::Current() | |
| 66 | |
| 67 // Sets a current sampling state of the given bucket. | |
| 68 // |category_and_name| doesn't need to be a constant string. | |
| 69 // The format of the string is "category\0name". | |
| 70 #define TRACE_EVENT_SET_NONCONST_SAMPLING_STATE_FOR_BUCKET( \ | |
| 71 bucket_number, category_and_name) \ | |
| 72 trace_event_internal:: \ | |
| 73 TraceEventSamplingStateScope<bucket_number>::Set(category_and_name) | |
| 74 | |
| 75 // Creates a scope of a sampling state of the given bucket. | |
| 76 // | |
| 77 // { // The sampling state is set within this scope. | |
| 78 // TRACE_EVENT_SAMPLING_STATE_SCOPE_FOR_BUCKET(0, "category", "name"); | |
| 79 // ...; | |
| 80 // } | |
| 81 #define TRACE_EVENT_SCOPED_SAMPLING_STATE_FOR_BUCKET( \ | |
| 82 bucket_number, category, name) \ | |
| 83 trace_event_internal::TraceEventSamplingStateScope<bucket_number> \ | |
| 84 traceEventSamplingScope(category "\0" name); | |
| 85 | |
| 86 #define TRACE_EVENT_API_CURRENT_THREAD_ID \ | 52 #define TRACE_EVENT_API_CURRENT_THREAD_ID \ |
| 87 static_cast<int>(base::PlatformThread::CurrentId()) | 53 static_cast<int>(base::PlatformThread::CurrentId()) |
| 88 | 54 |
| 89 #define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE() \ | 55 #define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE() \ |
| 90 UNLIKELY(*INTERNAL_TRACE_EVENT_UID(category_group_enabled) & \ | 56 UNLIKELY(*INTERNAL_TRACE_EVENT_UID(category_group_enabled) & \ |
| 91 (base::trace_event::TraceLog::ENABLED_FOR_RECORDING | \ | 57 (base::trace_event::TraceLog::ENABLED_FOR_RECORDING | \ |
| 92 base::trace_event::TraceLog::ENABLED_FOR_EVENT_CALLBACK | \ | 58 base::trace_event::TraceLog::ENABLED_FOR_EVENT_CALLBACK | \ |
| 93 base::trace_event::TraceLog::ENABLED_FOR_ETW_EXPORT | \ | 59 base::trace_event::TraceLog::ENABLED_FOR_ETW_EXPORT | \ |
| 94 base::trace_event::TraceLog::ENABLED_FOR_FILTERING)) | 60 base::trace_event::TraceLog::ENABLED_FOR_FILTERING)) |
| 95 | 61 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 | 191 |
| 226 // Defines atomic operations used internally by the tracing system. | 192 // Defines atomic operations used internally by the tracing system. |
| 227 #define TRACE_EVENT_API_ATOMIC_WORD base::subtle::AtomicWord | 193 #define TRACE_EVENT_API_ATOMIC_WORD base::subtle::AtomicWord |
| 228 #define TRACE_EVENT_API_ATOMIC_LOAD(var) base::subtle::NoBarrier_Load(&(var)) | 194 #define TRACE_EVENT_API_ATOMIC_LOAD(var) base::subtle::NoBarrier_Load(&(var)) |
| 229 #define TRACE_EVENT_API_ATOMIC_STORE(var, value) \ | 195 #define TRACE_EVENT_API_ATOMIC_STORE(var, value) \ |
| 230 base::subtle::NoBarrier_Store(&(var), (value)) | 196 base::subtle::NoBarrier_Store(&(var), (value)) |
| 231 | 197 |
| 232 // Defines visibility for classes in trace_event.h | 198 // Defines visibility for classes in trace_event.h |
| 233 #define TRACE_EVENT_API_CLASS_EXPORT BASE_EXPORT | 199 #define TRACE_EVENT_API_CLASS_EXPORT BASE_EXPORT |
| 234 | 200 |
| 235 // The thread buckets for the sampling profiler. | |
| 236 TRACE_EVENT_API_CLASS_EXPORT extern \ | |
| 237 TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3]; | |
| 238 | |
| 239 #define TRACE_EVENT_API_THREAD_BUCKET(thread_bucket) \ | |
| 240 g_trace_state[thread_bucket] | |
| 241 | |
| 242 //////////////////////////////////////////////////////////////////////////////// | 201 //////////////////////////////////////////////////////////////////////////////// |
| 243 | 202 |
| 244 // Implementation detail: trace event macros create temporary variables | 203 // Implementation detail: trace event macros create temporary variables |
| 245 // to keep instrumentation overhead low. These macros give each temporary | 204 // to keep instrumentation overhead low. These macros give each temporary |
| 246 // variable a unique name based on the line number to prevent name collisions. | 205 // variable a unique name based on the line number to prevent name collisions. |
| 247 #define INTERNAL_TRACE_EVENT_UID3(a,b) \ | 206 #define INTERNAL_TRACE_EVENT_UID3(a,b) \ |
| 248 trace_event_unique_##a##b | 207 trace_event_unique_##a##b |
| 249 #define INTERNAL_TRACE_EVENT_UID2(a,b) \ | 208 #define INTERNAL_TRACE_EVENT_UID2(a,b) \ |
| 250 INTERNAL_TRACE_EVENT_UID3(a,b) | 209 INTERNAL_TRACE_EVENT_UID3(a,b) |
| 251 #define INTERNAL_TRACE_EVENT_UID(name_prefix) \ | 210 #define INTERNAL_TRACE_EVENT_UID(name_prefix) \ |
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1093 | 1052 |
| 1094 // This macro generates less code then TRACE_EVENT0 but is also | 1053 // This macro generates less code then TRACE_EVENT0 but is also |
| 1095 // slower to execute when tracing is off. It should generally only be | 1054 // slower to execute when tracing is off. It should generally only be |
| 1096 // used with code that is seldom executed or conditionally executed | 1055 // used with code that is seldom executed or conditionally executed |
| 1097 // when debugging. | 1056 // when debugging. |
| 1098 // For now the category_group must be "gpu". | 1057 // For now the category_group must be "gpu". |
| 1099 #define TRACE_EVENT_BINARY_EFFICIENT0(category_group, name) \ | 1058 #define TRACE_EVENT_BINARY_EFFICIENT0(category_group, name) \ |
| 1100 trace_event_internal::ScopedTraceBinaryEfficient \ | 1059 trace_event_internal::ScopedTraceBinaryEfficient \ |
| 1101 INTERNAL_TRACE_EVENT_UID(scoped_trace)(category_group, name); | 1060 INTERNAL_TRACE_EVENT_UID(scoped_trace)(category_group, name); |
| 1102 | 1061 |
| 1103 // TraceEventSamplingStateScope records the current sampling state | |
| 1104 // and sets a new sampling state. When the scope exists, it restores | |
| 1105 // the sampling state having recorded. | |
| 1106 template<size_t BucketNumber> | |
| 1107 class TraceEventSamplingStateScope { | |
| 1108 public: | |
| 1109 TraceEventSamplingStateScope(const char* category_and_name) { | |
| 1110 previous_state_ = TraceEventSamplingStateScope<BucketNumber>::Current(); | |
| 1111 TraceEventSamplingStateScope<BucketNumber>::Set(category_and_name); | |
| 1112 } | |
| 1113 | |
| 1114 ~TraceEventSamplingStateScope() { | |
| 1115 TraceEventSamplingStateScope<BucketNumber>::Set(previous_state_); | |
| 1116 } | |
| 1117 | |
| 1118 static inline const char* Current() { | |
| 1119 return reinterpret_cast<const char*>(TRACE_EVENT_API_ATOMIC_LOAD( | |
| 1120 g_trace_state[BucketNumber])); | |
| 1121 } | |
| 1122 | |
| 1123 static inline void Set(const char* category_and_name) { | |
| 1124 TRACE_EVENT_API_ATOMIC_STORE( | |
| 1125 g_trace_state[BucketNumber], | |
| 1126 reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>( | |
| 1127 const_cast<char*>(category_and_name))); | |
| 1128 } | |
| 1129 | |
| 1130 private: | |
| 1131 const char* previous_state_; | |
| 1132 }; | |
| 1133 | |
| 1134 } // namespace trace_event_internal | 1062 } // namespace trace_event_internal |
| 1135 | 1063 |
| 1136 namespace base { | 1064 namespace base { |
| 1137 namespace trace_event { | 1065 namespace trace_event { |
| 1138 | 1066 |
| 1139 template<typename IDType> class TraceScopedTrackableObject { | 1067 template<typename IDType> class TraceScopedTrackableObject { |
| 1140 public: | 1068 public: |
| 1141 TraceScopedTrackableObject(const char* category_group, const char* name, | 1069 TraceScopedTrackableObject(const char* category_group, const char* name, |
| 1142 IDType id) | 1070 IDType id) |
| 1143 : category_group_(category_group), | 1071 : category_group_(category_group), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1159 const char* name_; | 1087 const char* name_; |
| 1160 IDType id_; | 1088 IDType id_; |
| 1161 | 1089 |
| 1162 DISALLOW_COPY_AND_ASSIGN(TraceScopedTrackableObject); | 1090 DISALLOW_COPY_AND_ASSIGN(TraceScopedTrackableObject); |
| 1163 }; | 1091 }; |
| 1164 | 1092 |
| 1165 } // namespace trace_event | 1093 } // namespace trace_event |
| 1166 } // namespace base | 1094 } // namespace base |
| 1167 | 1095 |
| 1168 #endif // BASE_TRACE_EVENT_TRACE_EVENT_H_ | 1096 #endif // BASE_TRACE_EVENT_TRACE_EVENT_H_ |
| OLD | NEW |