8 #ifndef PXR_BASE_TRACE_TRACE_H
9 #define PXR_BASE_TRACE_TRACE_H
22 #if !defined(TRACE_ENABLE)
23 #define TRACE_ENABLE 1
30 #define TRACE_FUNCTION() \
31 _TRACE_FUNCTION_INSTANCE(__LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__)
35 #define TRACE_SCOPE(name) \
36 _TRACE_SCOPE_INSTANCE(__LINE__, name)
40 #define TRACE_FUNCTION_SCOPE(name) \
41 _TRACE_FUNCTION_SCOPE_INSTANCE( \
42 __LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__, name)
45 #define TRACE_MARKER(name) \
46 _TRACE_MARKER_INSTANCE(__LINE__, name)
49 #define TRACE_MARKER_DYNAMIC(name) \
50 _TRACE_MARKER_DYNAMIC_INSTANCE(__LINE__, name)
57 #define TRACE_COUNTER_DELTA(name, delta) \
58 _TRACE_COUNTER_INSTANCE(__LINE__, name, delta, true)
64 #define TRACE_COUNTER_DELTA_DYNAMIC(name, delta) \
65 TraceCollector::GetInstance().RecordCounterDelta(name, delta);
70 #define TRACE_COUNTER_VALUE(name, value) \
71 _TRACE_COUNTER_INSTANCE(__LINE__, name, value, false)
77 #define TRACE_COUNTER_VALUE_DYNAMIC(name, value) \
78 TraceCollector::GetInstance().RecordCounterValue(name, value);
98 #define TRACE_COUNTER_DELTA_CODE(name, code) \
99 _TRACE_COUNTER_CODE_INSTANCE(__LINE__, name, code, true)
106 #define TRACE_FUNCTION_DYNAMIC(name) \
107 _TRACE_FUNCTION_DYNAMIC_INSTANCE(__LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__, name)
114 #define TRACE_SCOPE_DYNAMIC(name) \
115 _TRACE_SCOPE_DYNAMIC_INSTANCE(__LINE__, name)
124 #define _TRACE_FUNCTION_INSTANCE(instance, name, prettyName) \
125 constexpr static PXR_NS::TraceStaticKeyData \
126 TF_PP_CAT(TraceKeyData_, instance)(name, prettyName); \
127 PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
128 TF_PP_CAT(TraceKeyData_, instance));
130 #define _TRACE_SCOPE_INSTANCE(instance, name) \
131 constexpr static PXR_NS::TraceStaticKeyData \
132 TF_PP_CAT(TraceKeyData_, instance)(name); \
133 PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
134 TF_PP_CAT(TraceKeyData_, instance));
136 #define _TRACE_FUNCTION_SCOPE_INSTANCE(instance, name, prettyName, scopeName) \
137 constexpr static PXR_NS::TraceStaticKeyData \
138 TF_PP_CAT(TraceKeyData_, instance)(name, prettyName, scopeName); \
139 PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
140 TF_PP_CAT(TraceKeyData_, instance));
142 #define _TRACE_MARKER_INSTANCE(instance, name) \
143 constexpr static PXR_NS::TraceStaticKeyData \
144 TF_PP_CAT(TraceKeyData_, instance)(name); \
145 TraceCollector::GetInstance().MarkerEventStatic(TF_PP_CAT(TraceKeyData_, instance));
147 #define _TRACE_COUNTER_INSTANCE(instance, name, value, isDelta) \
148 constexpr static PXR_NS::TraceStaticKeyData \
149 TF_PP_CAT(TraceKeyData_, instance)(name); \
150 static PXR_NS::TraceCounterHolder \
151 TF_PP_CAT(TraceCounterHolder_, instance) \
152 (TF_PP_CAT(TraceKeyData_, instance)); \
153 TF_PP_CAT(TraceCounterHolder_, instance).Record(value, isDelta);
155 #define _TRACE_COUNTER_CODE_INSTANCE(instance, name, code, isDelta) \
156 static PXR_NS::TraceCounterHolder \
157 TF_PP_CAT(TraceCounterHolder_, instance)(name); \
158 if (TF_PP_CAT(TraceCounterHolder_, instance).IsEnabled()) { \
159 double value = 0.0; \
161 TF_PP_CAT(TraceCounterHolder_, instance).RecordDelta(value, isDelta); \
164 #define _TRACE_FUNCTION_DYNAMIC_INSTANCE(instance, fnName, fnPrettyName, name) \
165 PXR_NS::TraceAuto TF_PP_CAT(TraceAuto_, instance)(fnName, fnPrettyName, name)
167 #define _TRACE_SCOPE_DYNAMIC_INSTANCE(instance, str) \
168 PXR_NS::TraceAuto TF_PP_CAT(TraceAuto_, instance)(str)
170 #define _TRACE_MARKER_DYNAMIC_INSTANCE(instance, name) \
171 TraceCollector::GetInstance().MarkerEvent(name);
173 #else // TRACE_ENABLE
175 #define TRACE_FUNCTION()
176 #define TRACE_FUNCTION_DYNAMIC(name)
177 #define TRACE_SCOPE(name)
178 #define TRACE_SCOPE_DYNAMIC(name)
179 #define TRACE_FUNCTION_SCOPE(name)
180 #define TRACE_MARKER(name)
181 #define TRACE_MARKER_DYNAMIC(name)
182 #define TRACE_COUNTER_DELTA(name, delta)
183 #define TRACE_COUNTER_VALUE(name, value)
185 #endif // TRACE_ENABLE
206 template <
typename... Args>
209 , _intervalTimer(false) {
211 _intervalTimer.
Start();
247 TraceAuto(
const char *funcName,
const char *prettyFuncName,
248 const std::string &
name)
249 : _key(_CreateKeyString(funcName, prettyFuncName, name)) {
250 std::atomic_thread_fence(std::memory_order_seq_cst);
253 std::atomic_thread_fence(std::memory_order_seq_cst);
260 std::atomic_thread_fence(std::memory_order_seq_cst);
263 std::atomic_thread_fence(std::memory_order_seq_cst);
284 std::atomic_thread_fence(std::memory_order_seq_cst);
286 std::atomic_thread_fence(std::memory_order_seq_cst);
290 static std::string _CreateKeyString(
291 const char *funcName,
292 const char *prettyFuncName,
293 const std::string &
name) {
340 #endif // PXR_BASE_TRACE_TRACE_H
static TRACE_API TraceCollector & GetInstance()
Returns the singleton instance.
void RecordCounterValue(const TraceKey &key, double value)
Record a counter value for a name key if Category is enabled.
~TraceScopeAuto() noexcept
#define PXR_NAMESPACE_OPEN_SCOPE
GLsizei const GLfloat * value
TraceAuto(const char *funcName, const char *prettyFuncName, const std::string &name)
TraceAuto(const TfToken &key)
void ScopeArgs(Args &&...args)
static bool IsEnabled()
Returns whether collection of events is enabled for DefaultCategory.
uint64_t GetCurrentTicks()
TraceAuto & operator=(const TraceAuto &)=delete
uint64_t GetStartTicks() const
GLuint const GLchar * name
void Record(double value, bool delta)
TimeStamp EndEvent(const Key &key)
#define PXR_NAMESPACE_CLOSE_SCOPE
TimeStamp BeginEvent(const Key &key)
static TRACE_API void Scope(const TraceKey &key, TimeStamp start, TimeStamp stop) noexcept
**If you just want to fire and args
TraceCounterHolder(const TraceKey &key)
TraceAuto(const std::string &key)
TraceScopeAuto(const TraceStaticKeyData &key) noexcept
PXR_NAMESPACE_OPEN_SCOPE ARCH_API std::string ArchGetPrettierFunctionName(const std::string &function, const std::string &prettyFunction)
TraceScopeAuto(const TraceStaticKeyData &key, Args &&...args)
TraceEvent::TimeStamp TimeStamp
void RecordCounterDelta(const TraceKey &key, double delta)
Record a counter delta for a name key if Category is enabled.