Loading...
Searching...
No Matches
trace.h
Go to the documentation of this file.
1//
2// Copyright 2018 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7
8#ifndef PXR_BASE_TRACE_TRACE_H
9#define PXR_BASE_TRACE_TRACE_H
10
12
13#include "pxr/pxr.h"
14
15#include "pxr/base/trace/api.h"
16#include "pxr/base/trace/collector.h"
17
18#include "pxr/base/tf/preprocessorUtilsLite.h"
19
20#include <atomic>
21
22#if !defined(TRACE_ENABLE)
23 #define TRACE_ENABLE 1
24#endif
25
26#if TRACE_ENABLE
27
30#define TRACE_FUNCTION() \
31 _TRACE_FUNCTION_INSTANCE(__LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__)
32
35#define TRACE_SCOPE(name) \
36 _TRACE_SCOPE_INSTANCE(__LINE__, name)
37
40#define TRACE_FUNCTION_SCOPE(name) \
41 _TRACE_FUNCTION_SCOPE_INSTANCE( \
42 __LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__, name)
43
45#define TRACE_MARKER(name) \
46 _TRACE_MARKER_INSTANCE(__LINE__, name)
47
49#define TRACE_MARKER_DYNAMIC(name) \
50 _TRACE_MARKER_DYNAMIC_INSTANCE(__LINE__, name)
51
57#define TRACE_COUNTER_DELTA(name, delta) \
58 _TRACE_COUNTER_INSTANCE(__LINE__, name, delta, /* isDelta */ true)
59
64#define TRACE_COUNTER_DELTA_DYNAMIC(name, delta) \
65 TraceCollector::GetInstance().RecordCounterDelta(name, delta);
66
70#define TRACE_COUNTER_VALUE(name, value) \
71 _TRACE_COUNTER_INSTANCE(__LINE__, name, value, /* isDelta */ false)
72
77#define TRACE_COUNTER_VALUE_DYNAMIC(name, value) \
78 TraceCollector::GetInstance().RecordCounterValue(name, value);
79
98#define TRACE_COUNTER_DELTA_CODE(name, code) \
99 _TRACE_COUNTER_CODE_INSTANCE(__LINE__, name, code, true)
100
106#define TRACE_FUNCTION_DYNAMIC(name) \
107 _TRACE_FUNCTION_DYNAMIC_INSTANCE(__LINE__, __ARCH_FUNCTION__, __ARCH_PRETTY_FUNCTION__, name)
108
114#define TRACE_SCOPE_DYNAMIC(name) \
115 _TRACE_SCOPE_DYNAMIC_INSTANCE(__LINE__, name)
116
117
122
123
124#define _TRACE_FUNCTION_INSTANCE(instance, name, prettyName) \
125constexpr static PXR_NS::TraceStaticKeyData \
126 TF_PP_CAT(TraceKeyData_, instance)(name, prettyName); \
127PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
128 TF_PP_CAT(TraceKeyData_, instance));
129
130#define _TRACE_SCOPE_INSTANCE(instance, name) \
131constexpr static PXR_NS::TraceStaticKeyData \
132 TF_PP_CAT(TraceKeyData_, instance)(name); \
133PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
134 TF_PP_CAT(TraceKeyData_, instance));
135
136#define _TRACE_FUNCTION_SCOPE_INSTANCE(instance, name, prettyName, scopeName) \
137constexpr static PXR_NS::TraceStaticKeyData \
138 TF_PP_CAT(TraceKeyData_, instance)(name, prettyName, scopeName); \
139PXR_NS::TraceScopeAuto TF_PP_CAT(TraceScopeAuto_, instance)(\
140 TF_PP_CAT(TraceKeyData_, instance));
141
142#define _TRACE_MARKER_INSTANCE(instance, name) \
143constexpr static PXR_NS::TraceStaticKeyData \
144 TF_PP_CAT(TraceKeyData_, instance)(name); \
145 TraceCollector::GetInstance().MarkerEventStatic(TF_PP_CAT(TraceKeyData_, instance));
146
147#define _TRACE_COUNTER_INSTANCE(instance, name, value, isDelta) \
148constexpr static PXR_NS::TraceStaticKeyData \
149 TF_PP_CAT(TraceKeyData_, instance)(name); \
150static PXR_NS::TraceCounterHolder \
151 TF_PP_CAT(TraceCounterHolder_, instance) \
152 (TF_PP_CAT(TraceKeyData_, instance)); \
153TF_PP_CAT(TraceCounterHolder_, instance).Record(value, isDelta);
154
155#define _TRACE_COUNTER_CODE_INSTANCE(instance, name, code, isDelta) \
156static PXR_NS::TraceCounterHolder \
157 TF_PP_CAT(TraceCounterHolder_, instance)(name); \
158if (TF_PP_CAT(TraceCounterHolder_, instance).IsEnabled()) { \
159 double value = 0.0; \
160 code \
161 TF_PP_CAT(TraceCounterHolder_, instance).RecordDelta(value, isDelta); \
162}
163
164#define _TRACE_FUNCTION_DYNAMIC_INSTANCE(instance, fnName, fnPrettyName, name) \
165PXR_NS::TraceAuto TF_PP_CAT(TraceAuto_, instance)(fnName, fnPrettyName, name)
166
167#define _TRACE_SCOPE_DYNAMIC_INSTANCE(instance, str) \
168PXR_NS::TraceAuto TF_PP_CAT(TraceAuto_, instance)(str)
169
170#define _TRACE_MARKER_DYNAMIC_INSTANCE(instance, name) \
171 TraceCollector::GetInstance().MarkerEvent(name);
172
173#else // TRACE_ENABLE
174
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)
184
185#endif // TRACE_ENABLE
186
187PXR_NAMESPACE_OPEN_SCOPE
188
196public:
199 explicit TraceScopeAuto(const TraceStaticKeyData& key) noexcept
200 : _key(&key)
201 , _intervalTimer(/*start=*/TraceCollector::IsEnabled()) {
202 }
203
206 template < typename... Args>
207 TraceScopeAuto(const TraceStaticKeyData& key, Args&&... args)
208 : _key(&key)
209 , _intervalTimer(/*start=*/false) {
211 _intervalTimer.Start();
212 TraceCollector
213 ::GetInstance().ScopeArgs(std::forward<Args>(args)...);
214 }
215 }
216
219 ~TraceScopeAuto() noexcept {
220 if (_intervalTimer.IsStarted()) {
221 TraceCollector::TimeStamp stopTicks =
222 _intervalTimer.GetCurrentTicks();
224 *_key, _intervalTimer.GetStartTicks(), stopTicks);
225 }
226 }
227
228private:
229 const TraceStaticKeyData* const _key;
230 ArchIntervalTimer _intervalTimer;
231};
232
244struct TraceAuto {
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);
251 _collector = &TraceCollector::GetInstance();
252 _collector->BeginEvent(_key);
253 std::atomic_thread_fence(std::memory_order_seq_cst);
254 }
255
258 explicit TraceAuto(const TfToken& key)
259 : _key(key) {
260 std::atomic_thread_fence(std::memory_order_seq_cst);
261 _collector = &TraceCollector::GetInstance();
262 _collector->BeginEvent(_key);
263 std::atomic_thread_fence(std::memory_order_seq_cst);
264 }
265
268 explicit TraceAuto(const std::string& key)
269 : TraceAuto(TfToken(key)) {}
270
271 // Non-copyable
272 //
273 TraceAuto(const TraceAuto &) = delete;
274 TraceAuto& operator=(const TraceAuto &) = delete;
275
276 // Non-movable
277 //
278 TraceAuto(TraceAuto &&) = delete;
279 TraceAuto& operator=(TraceAuto &&) = delete;
280
284 std::atomic_thread_fence(std::memory_order_seq_cst);
285 _collector->EndEvent(_key);
286 std::atomic_thread_fence(std::memory_order_seq_cst);
287 }
288
289private:
290 static std::string _CreateKeyString(
291 const char *funcName,
292 const char *prettyFuncName,
293 const std::string &name) {
294 std::string key = ArchGetPrettierFunctionName(funcName, prettyFuncName);
295 key += " [";
296 key += name;
297 key += "]";
298 return key;
299 }
300
301 TraceCollector* _collector;
302 TraceDynamicKey _key;
303};
304
312public:
315 explicit TraceCounterHolder(const TraceKey& key)
316 : _key(key) {}
317
320 bool IsEnabled() const {
322 }
323
326 void Record(double value, bool delta) {
327 if (delta) {
329 } else {
331 }
332 }
333
334private:
335 TraceKey _key;
336};
337
338PXR_NAMESPACE_CLOSE_SCOPE
339
340#endif // PXR_BASE_TRACE_TRACE_H
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:71
This is a singleton class that records TraceEvent instances and populates TraceCollection instances.
Definition: collector.h:54
void RecordCounterDelta(const TraceKey &key, double delta)
Record a counter delta for a name key if Category is enabled.
Definition: collector.h:337
TimeStamp EndEvent(const Key &key)
Record an end event with key if Category is enabled.
Definition: collector.h:148
static TRACE_API void Scope(const TraceKey &key, TimeStamp start, TimeStamp stop) noexcept
Record a scope event described by key that started at start for the DefaultCategory.
static bool IsEnabled()
Returns whether collection of events is enabled for DefaultCategory.
Definition: collector.h:77
void RecordCounterValue(const TraceKey &key, double value)
Record a counter value for a name key if Category is enabled.
Definition: collector.h:358
static TRACE_API TraceCollector & GetInstance()
Returns the singleton instance.
Definition: collector.h:67
TimeStamp BeginEvent(const Key &key)
Record a begin event with key if Category is enabled.
Definition: collector.h:119
Holds on to a counter key, as well as the global collector for fast lookup.
Definition: trace.h:311
bool IsEnabled() const
Returns whether the TraceCollector is enabled or not.
Definition: trace.h:320
TraceCounterHolder(const TraceKey &key)
Constructor used by TRACE_COUNTER_* macro.
Definition: trace.h:315
void Record(double value, bool delta)
Records a counter delta value if the TraceCollector is enabled.
Definition: trace.h:326
This class stores data used to create dynamic keys which can be referenced in TraceEvent instances.
Definition: dynamicKey.h:25
A wrapper around a TraceStaticKeyData pointer that is stored in TraceEvent instances.
Definition: key.h:23
A class which records a timestamp when it is created and a scope event when it is destructed.
Definition: trace.h:195
TraceScopeAuto(const TraceStaticKeyData &key) noexcept
Constructor for TRACE_FUNCTION macro.
Definition: trace.h:199
~TraceScopeAuto() noexcept
Destructor.
Definition: trace.h:219
TraceScopeAuto(const TraceStaticKeyData &key, Args &&... args)
Constructor that also records scope arguments.
Definition: trace.h:207
This class holds data necessary to create keys for TraceEvent instances.
Definition: staticKeyData.h:26
ARCH_API std::string ArchGetPrettierFunctionName(const std::string &function, const std::string &prettyFunction)
Return well formatted function name.
A simple timer class for measuring an interval of time using the ArchTickTimer facilities.
Definition: timing.h:162
uint64_t GetCurrentTicks()
Read and return the current time.
Definition: timing.h:193
void Start()
Start the timer, or reset the start time if it has already been started.
Definition: timing.h:172
uint64_t GetStartTicks() const
Return this timer's start time, or 0 if it hasn't been started.
Definition: timing.h:188
bool IsStarted() const
Return true if this timer is started.
Definition: timing.h:183
A class which records a begin event when it is constructed, and a matching end event when it is destr...
Definition: trace.h:244
~TraceAuto()
Destructor.
Definition: trace.h:283
TraceAuto(const TfToken &key)
Constructor taking a TfToken key.
Definition: trace.h:258
TraceAuto(const char *funcName, const char *prettyFuncName, const std::string &name)
Constructor taking function name, pretty function name and a scope name.
Definition: trace.h:247
TraceAuto(const std::string &key)
Constructor taking a string key.
Definition: trace.h:268