1 #ifndef ANDROID_PDX_TRACE_H_
2 #define ANDROID_PDX_TRACE_H_
3 
4 #include <array>
5 
6 #include <utils/Trace.h>
7 
8 // Enables internal tracing in libpdx. This is disabled by default to avoid
9 // spamming the trace buffers during normal trace activities. libpdx must be
10 // built with this set to true to enable internal tracing.
11 #ifndef PDX_LIB_TRACE_ENABLED
12 #define PDX_LIB_TRACE_ENABLED false
13 #endif
14 
15 namespace android {
16 namespace pdx {
17 
18 // Utility to generate scoped tracers with arguments.
19 class ScopedTraceArgs {
20  public:
21   template <typename... Args>
ScopedTraceArgs(uint64_t tag,const char * format,Args &&...args)22   ScopedTraceArgs(uint64_t tag, const char* format, Args&&... args)
23       : tag_{tag} {
24     if (atrace_is_tag_enabled(tag_)) {
25       std::array<char, 1024> buffer;
26       snprintf(buffer.data(), buffer.size(), format,
27                std::forward<Args>(args)...);
28       atrace_begin(tag_, buffer.data());
29     }
30   }
31 
~ScopedTraceArgs()32   ~ScopedTraceArgs() { atrace_end(tag_); }
33 
34  private:
35   uint64_t tag_;
36 
37   ScopedTraceArgs(const ScopedTraceArgs&) = delete;
38   void operator=(const ScopedTraceArgs&) = delete;
39 };
40 
41 // Utility to generate scoped tracers.
42 class ScopedTrace {
43  public:
44   template <typename... Args>
ScopedTrace(uint64_t tag,bool enabled,const char * name)45   ScopedTrace(uint64_t tag, bool enabled, const char* name)
46       : tag_{tag}, enabled_{enabled} {
47     if (enabled_)
48       atrace_begin(tag_, name);
49   }
50 
~ScopedTrace()51   ~ScopedTrace() {
52     if (enabled_)
53       atrace_end(tag_);
54   }
55 
56  private:
57   uint64_t tag_;
58   bool enabled_;
59 
60   ScopedTrace(const ScopedTrace&) = delete;
61   void operator=(const ScopedTrace&) = delete;
62 };
63 
64 }  // namespace pdx
65 }  // namespace android
66 
67 // Macro to define a scoped tracer with arguments. Uses PASTE(x, y) macro
68 // defined in utils/Trace.h.
69 #define PDX_TRACE_FORMAT(format, ...)                         \
70   ::android::pdx::ScopedTraceArgs PASTE(__tracer, __LINE__) { \
71     ATRACE_TAG, format, ##__VA_ARGS__                         \
72   }
73 
74 // TODO(eieio): Rename this to PDX_LIB_TRACE_NAME() for internal use by libpdx
75 // and rename internal uses inside the library. This version is only enabled
76 // when PDX_LIB_TRACE_ENABLED is true.
77 #define PDX_TRACE_NAME(name)                              \
78   ::android::pdx::ScopedTrace PASTE(__tracer, __LINE__) { \
79     ATRACE_TAG, PDX_LIB_TRACE_ENABLED, name               \
80   }
81 
82 #endif  // ANDROID_PDX_TRACE_H_
83