25 #ifndef PXR_BASE_TRACE_TRACE_H
26 #define PXR_BASE_TRACE_TRACE_H
32 #include "pxr/base/trace/api.h"
33 #include "pxr/base/trace/collector.h"
35 #include "pxr/base/tf/preprocessorUtilsLite.h"
39 #if !defined(TRACE_DISABLE)
43 #define TRACE_FUNCTION() \
44 _TRACE_FUNCTION_INSTANCE(__LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__)
48 #define TRACE_SCOPE(name) \
49 _TRACE_SCOPE_INSTANCE(__LINE__, name)
53 #define TRACE_FUNCTION_SCOPE(name) \
54 _TRACE_FUNCTION_SCOPE_INSTANCE( \
55 __LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__, name)
58 #define TRACE_MARKER(name) \
59 _TRACE_MARKER_INSTANCE(__LINE__, name)
62 #define TRACE_MARKER_DYNAMIC(name) \
63 _TRACE_MARKER_DYNAMIC_INSTANCE(__LINE__, name)
70 #define TRACE_COUNTER_DELTA(name, delta) \
71 _TRACE_COUNTER_INSTANCE(__LINE__, name, delta, true)
77 #define TRACE_COUNTER_DELTA_DYNAMIC(name, delta) \
78 TraceCollector::GetInstance().RecordCounterDelta(name, delta);
83 #define TRACE_COUNTER_VALUE(name, value) \
84 _TRACE_COUNTER_INSTANCE(__LINE__, name, value, false)
90 #define TRACE_COUNTER_VALUE_DYNAMIC(name, value) \
91 TraceCollector::GetInstance().RecordCounterValue(name, value);
111 #define TRACE_COUNTER_DELTA_CODE(name, code) \
112 _TRACE_COUNTER_CODE_INSTANCE(__LINE__, name, code, true)
119 #define TRACE_FUNCTION_DYNAMIC(name) \
120 _TRACE_FUNCTION_DYNAMIC_INSTANCE(__LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__, name)
127 #define TRACE_SCOPE_DYNAMIC(name) \
128 _TRACE_SCOPE_DYNAMIC_INSTANCE(__LINE__, name)
137 #define _TRACE_FUNCTION_INSTANCE(instance, name, prettyName) \
138 constexpr static PXR_NS::TraceStaticKeyData \
139 TF_PP_CAT(TraceKeyData_, instance)(name, prettyName); \
140 PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
141 TF_PP_CAT(TraceKeyData_, instance));
143 #define _TRACE_SCOPE_INSTANCE(instance, name) \
144 constexpr static PXR_NS::TraceStaticKeyData \
145 TF_PP_CAT(TraceKeyData_, instance)(name); \
146 PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
147 TF_PP_CAT(TraceKeyData_, instance));
149 #define _TRACE_FUNCTION_SCOPE_INSTANCE(instance, name, prettyName, scopeName) \
150 constexpr static PXR_NS::TraceStaticKeyData \
151 TF_PP_CAT(TraceKeyData_, instance)(name, prettyName, scopeName); \
152 PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
153 TF_PP_CAT(TraceKeyData_, instance));
155 #define _TRACE_MARKER_INSTANCE(instance, name) \
156 constexpr static PXR_NS::TraceStaticKeyData \
157 TF_PP_CAT(TraceKeyData_, instance)(name); \
158 TraceCollector::GetInstance().MarkerEventStatic(TF_PP_CAT(TraceKeyData_, instance));
160 #define _TRACE_COUNTER_INSTANCE(instance, name, value, isDelta) \
161 constexpr static PXR_NS::TraceStaticKeyData \
162 TF_PP_CAT(TraceKeyData_, instance)(name); \
163 static PXR_NS::TraceCounterHolder \
164 TF_PP_CAT(TraceCounterHolder_, instance) \
165 (TF_PP_CAT(TraceKeyData_, instance)); \
166 TF_PP_CAT(TraceCounterHolder_, instance).Record(value, isDelta);
168 #define _TRACE_COUNTER_CODE_INSTANCE(instance, name, code, isDelta) \
169 static PXR_NS::TraceCounterHolder \
170 TF_PP_CAT(TraceCounterHolder_, instance)(name); \
171 if (TF_PP_CAT(TraceCounterHolder_, instance).IsEnabled()) { \
172 double value = 0.0; \
174 TF_PP_CAT(TraceCounterHolder_, instance).RecordDelta(value, isDelta); \
177 #define _TRACE_FUNCTION_DYNAMIC_INSTANCE(instance, fnName, fnPrettyName, name) \
178 PXR_NS::TraceAuto TF_PP_CAT(TraceAuto_, instance)(fnName, fnPrettyName, name)
180 #define _TRACE_SCOPE_DYNAMIC_INSTANCE(instance, str) \
181 PXR_NS::TraceAuto TF_PP_CAT(TraceAuto_, instance)(str)
183 #define _TRACE_MARKER_DYNAMIC_INSTANCE(instance, name) \
184 TraceCollector::GetInstance().MarkerEvent(name);
186 #else // TRACE_DISABLE
188 #define TRACE_FUNCTION()
189 #define TRACE_FUNCTION_DYNAMIC(name)
190 #define TRACE_SCOPE(name)
191 #define TRACE_SCOPE_DYNAMIC(name)
192 #define TRACE_FUNCTION_SCOPE(name)
193 #define TRACE_MARKER(name)
194 #define TRACE_MARKER_DYNAMIC(name)
196 #endif // TRACE_DISABLE
198 PXR_NAMESPACE_OPEN_SCOPE
224 template <
typename... Args>
227 if (ARCH_UNLIKELY(_key)) {
235 if (ARCH_UNLIKELY(_key)) {
259 TraceAuto(
const char *funcName,
const char *prettyFuncName,
260 const std::string &name)
261 : _key(_CreateKeyString(funcName, prettyFuncName, name)) {
262 std::atomic_thread_fence(std::memory_order_seq_cst);
265 std::atomic_thread_fence(std::memory_order_seq_cst);
272 std::atomic_thread_fence(std::memory_order_seq_cst);
275 std::atomic_thread_fence(std::memory_order_seq_cst);
296 std::atomic_thread_fence(std::memory_order_seq_cst);
298 std::atomic_thread_fence(std::memory_order_seq_cst);
302 static std::string _CreateKeyString(
303 const char *funcName,
304 const char *prettyFuncName,
305 const std::string &name) {
350 PXR_NAMESPACE_CLOSE_SCOPE
352 #endif // PXR_BASE_TRACE_TRACE_H
bool IsEnabled() const
Returns whether the TraceCollector is enabled or not.
Holds on to a counter key, as well as the global collector for fast lookup.
TraceScopeAuto(const TraceStaticKeyData &key, Args &&...args)
Constructor that also records scope arguments.
TraceScopeAuto(const TraceStaticKeyData &key)
Constructor for TRACE_FUNCTION macro.
TraceCounterHolder(const TraceKey &key)
Constructor used by TRACE_COUNTER_* macro.
uint64_t ArchGetTickTime()
Return the current time in system-dependent units.
TimeStamp EndEvent(const Key &key)
Record an end event with key if Category is enabled.
TraceAuto(const char *funcName, const char *prettyFuncName, const std::string &name)
Constructor taking function name, pretty function name and a scope name.
uint64_t TimeStamp
Time in "ticks".
void RecordCounterValue(const TraceKey &key, double value)
Record a counter value for a name key if Category is enabled.
A class which records a begin event when it is constructed, and a matching end event when it is destr...
This class stores data used to create dynamic keys which can be referenced in TraceEvent instances...
TimeStamp BeginEvent(const Key &key)
Record a begin event with key if Category is enabled.
Token for efficient comparison, assignment, and hashing of known strings.
void ScopeArgs(Args &&...args)
Record multiple data events with category cat if Category is enabled.
static TRACE_API TraceCollector & GetInstance()
Returns the singleton instance.
A class which records a timestamp when it is created and a scope event when it is destructed...
This is a singleton class that records TraceEvent instances and populates TraceCollection instances...
void Scope(const TraceKey &key, TimeStamp start)
Record a scope event described by key that started at start if Category is enabled.
~TraceScopeAuto()
Destructor.
TraceAuto(const TfToken &key)
Constructor taking a TfToken key.
static bool IsEnabled()
Returns whether collection of events is enabled for DefaultCategory.
void Record(double value, bool delta)
Records a counter delta value if the TraceCollector is enabled.
TraceAuto(const std::string &key)
Constructor taking a string key.
void RecordCounterDelta(const TraceKey &key, double delta)
Record a counter delta for a name key if Category is enabled.
ARCH_API std::string ArchGetPrettierFunctionName(const std::string &function, const std::string &prettyFunction)
Return well formatted function name.
This class holds data necessary to create keys for TraceEvent instances.
A wrapper around a TraceStaticKeyData pointer that is stored in TraceEvent instances.