1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_PDX_TRACE_H_ 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_PDX_TRACE_H_ 3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 44a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka#include <array> 5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <utils/Trace.h> 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 84a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// Enables internal tracing in libpdx. This is disabled by default to avoid 94a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// spamming the trace buffers during normal trace activities. libpdx must be 104a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// built with this set to true to enable internal tracing. 114a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka#ifndef PDX_LIB_TRACE_ENABLED 124a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka#define PDX_LIB_TRACE_ENABLED false 13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif 14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 154a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabakanamespace android { 164a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabakanamespace pdx { 174a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 184a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// Utility to generate scoped tracers with arguments. 194a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabakaclass ScopedTraceArgs { 204a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka public: 214a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka template <typename... Args> 224a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ScopedTraceArgs(uint64_t tag, const char* format, Args&&... args) 234a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka : tag_{tag} { 244a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka if (atrace_is_tag_enabled(tag_)) { 254a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka std::array<char, 1024> buffer; 264a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka snprintf(buffer.data(), buffer.size(), format, 274a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka std::forward<Args>(args)...); 284a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka atrace_begin(tag_, buffer.data()); 294a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka } 304a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka } 314a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 324a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ~ScopedTraceArgs() { atrace_end(tag_); } 334a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 344a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka private: 354a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka uint64_t tag_; 364a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 374a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ScopedTraceArgs(const ScopedTraceArgs&) = delete; 384a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka void operator=(const ScopedTraceArgs&) = delete; 394a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka}; 404a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 414a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// Utility to generate scoped tracers. 424a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabakaclass ScopedTrace { 434a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka public: 444a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka template <typename... Args> 454a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ScopedTrace(uint64_t tag, bool enabled, const char* name) 464a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka : tag_{tag}, enabled_{enabled} { 474a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka if (enabled_) 484a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka atrace_begin(tag_, name); 494a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka } 504a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 514a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ~ScopedTrace() { 524a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka if (enabled_) 534a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka atrace_end(tag_); 544a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka } 554a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 564a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka private: 574a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka uint64_t tag_; 584a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka bool enabled_; 594a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 604a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ScopedTrace(const ScopedTrace&) = delete; 614a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka void operator=(const ScopedTrace&) = delete; 624a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka}; 634a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 644a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka} // namespace pdx 654a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka} // namespace android 664a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 674a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// Macro to define a scoped tracer with arguments. Uses PASTE(x, y) macro 684a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// defined in utils/Trace.h. 694a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka#define PDX_TRACE_FORMAT(format, ...) \ 704a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ::android::pdx::ScopedTraceArgs PASTE(__tracer, __LINE__) { \ 714a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ATRACE_TAG, format, ##__VA_ARGS__ \ 724a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka } 734a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka 744a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// TODO(eieio): Rename this to PDX_LIB_TRACE_NAME() for internal use by libpdx 754a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// and rename internal uses inside the library. This version is only enabled 764a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka// when PDX_LIB_TRACE_ENABLED is true. 774a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka#define PDX_TRACE_NAME(name) \ 784a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ::android::pdx::ScopedTrace PASTE(__tracer, __LINE__) { \ 794a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka ATRACE_TAG, PDX_LIB_TRACE_ENABLED, name \ 804a05cbf36fe1a06eef56e28f45fe4789fc210114Corey Tabaka } 81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif // ANDROID_PDX_TRACE_H_ 83