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