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 15namespace android { 16namespace pdx { 17 18// Utility to generate scoped tracers with arguments. 19class ScopedTraceArgs { 20 public: 21 template <typename... 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 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. 42class ScopedTrace { 43 public: 44 template <typename... Args> 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 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