#ifndef ANDROID_PDX_TRACE_H_ #define ANDROID_PDX_TRACE_H_ #include #include // Enables internal tracing in libpdx. This is disabled by default to avoid // spamming the trace buffers during normal trace activities. libpdx must be // built with this set to true to enable internal tracing. #ifndef PDX_LIB_TRACE_ENABLED #define PDX_LIB_TRACE_ENABLED false #endif namespace android { namespace pdx { // Utility to generate scoped tracers with arguments. class ScopedTraceArgs { public: template ScopedTraceArgs(uint64_t tag, const char* format, Args&&... args) : tag_{tag} { if (atrace_is_tag_enabled(tag_)) { std::array buffer; snprintf(buffer.data(), buffer.size(), format, std::forward(args)...); atrace_begin(tag_, buffer.data()); } } ~ScopedTraceArgs() { atrace_end(tag_); } private: uint64_t tag_; ScopedTraceArgs(const ScopedTraceArgs&) = delete; void operator=(const ScopedTraceArgs&) = delete; }; // Utility to generate scoped tracers. class ScopedTrace { public: template ScopedTrace(uint64_t tag, bool enabled, const char* name) : tag_{tag}, enabled_{enabled} { if (enabled_) atrace_begin(tag_, name); } ~ScopedTrace() { if (enabled_) atrace_end(tag_); } private: uint64_t tag_; bool enabled_; ScopedTrace(const ScopedTrace&) = delete; void operator=(const ScopedTrace&) = delete; }; } // namespace pdx } // namespace android // Macro to define a scoped tracer with arguments. Uses PASTE(x, y) macro // defined in utils/Trace.h. #define PDX_TRACE_FORMAT(format, ...) \ ::android::pdx::ScopedTraceArgs PASTE(__tracer, __LINE__) { \ ATRACE_TAG, format, ##__VA_ARGS__ \ } // TODO(eieio): Rename this to PDX_LIB_TRACE_NAME() for internal use by libpdx // and rename internal uses inside the library. This version is only enabled // when PDX_LIB_TRACE_ENABLED is true. #define PDX_TRACE_NAME(name) \ ::android::pdx::ScopedTrace PASTE(__tracer, __LINE__) { \ ATRACE_TAG, PDX_LIB_TRACE_ENABLED, name \ } #endif // ANDROID_PDX_TRACE_H_