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