Home | History | Annotate | Download | only in pdx
      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 
     15 namespace android {
     16 namespace pdx {
     17 
     18 // Utility to generate scoped tracers with arguments.
     19 class 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.
     42 class 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