| /* |
| * Copyright 2018 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef CAMERA_HAL_ADAPTER_CAMERA_TRACE_EVENT_H_ |
| #define CAMERA_HAL_ADAPTER_CAMERA_TRACE_EVENT_H_ |
| |
| #define TRACE_CAMERA_COMBINE_NAME1(X, Y) X##Y |
| #define TRACE_CAMERA_COMBINE_NAME(X, Y) TRACE_CAMERA_COMBINE_NAME1(X, Y) |
| |
| #define TRACE_CAMERA_ENABLE(enabled) \ |
| cros::tracer::EventTracer::GetInstance()->SetEnabled(enabled) |
| #define TRACE_CAMERA_SCOPED(...) \ |
| cros::tracer::ScopedTrace TRACE_CAMERA_COMBINE_NAME( \ |
| scoped_trace_, __LINE__)(__FUNCTION__, ##__VA_ARGS__) |
| #define TRACE_CAMERA_INSTANT(...) \ |
| (cros::tracer::ScopedTrace(__FUNCTION__, ##__VA_ARGS__)) |
| #define TRACE_CAMERA_BEGIN(name, ...) \ |
| cros::tracer::EventTracer::GetInstance()->BeginTrace( \ |
| name, cros::tracer::ArgsString(__VA_ARGS__)) |
| #define TRACE_CAMERA_END(name, ...) \ |
| cros::tracer::EventTracer::GetInstance()->EndTrace( \ |
| name, cros::tracer::ArgsString(__VA_ARGS__)) |
| #define TRACE_CAMERA_ASYNC_BEGIN(name, cookie, ...) \ |
| cros::tracer::EventTracer::GetInstance()->AsyncBeginTrace( \ |
| name, cookie, cros::tracer::ArgsString(__VA_ARGS__)) |
| #define TRACE_CAMERA_ASYNC_END(name, cookie, ...) \ |
| cros::tracer::EventTracer::GetInstance()->AsyncEndTrace( \ |
| name, cookie, cros::tracer::ArgsString(__VA_ARGS__)) |
| #define TRACE_CAMERA_COUNTER(name, value) \ |
| cros::tracer::EventTracer::GetInstance()->Counter(name, value) |
| |
| #include <set> |
| #include <sstream> |
| #include <string> |
| |
| #include <base/compiler_specific.h> |
| #include <base/files/file.h> |
| #include <base/strings/string_piece.h> |
| #include <base/synchronization/lock.h> |
| |
| namespace cros { |
| |
| namespace tracer { |
| |
| class EventTracer { |
| public: |
| EventTracer(); |
| |
| // Not copyable or movable |
| EventTracer(const EventTracer&) = delete; |
| EventTracer& operator=(const EventTracer&) = delete; |
| |
| static EventTracer* GetInstance(); |
| void SetEnabled(bool enabled); |
| void BeginTrace(base::StringPiece name, base::StringPiece args); |
| void EndTrace(base::StringPiece name, base::StringPiece args); |
| void AsyncBeginTrace(base::StringPiece name, |
| int cookie, |
| base::StringPiece args); |
| void AsyncEndTrace(base::StringPiece name, |
| int cookie, |
| base::StringPiece args); |
| void Counter(base::StringPiece name, int value); |
| |
| private: |
| void TracePrintf(const char* format, ...) PRINTF_FORMAT(2, 3); |
| |
| bool tracing_enabled_ = false; |
| std::set<pid_t> begun_tid_; |
| base::File trace_file_; |
| base::Lock event_tracer_lock_; |
| }; |
| |
| inline void AppendArgsString(std::stringstream& args_buf) {} |
| |
| template <typename ArgName, typename ArgVal, typename... Rest> |
| void AppendArgsString(std::stringstream& args_buf, |
| ArgName arg_name, |
| ArgVal arg_val, |
| Rest... rest) { |
| args_buf << arg_name << "=" << arg_val << ";"; |
| AppendArgsString(args_buf, rest...); |
| } |
| |
| template <typename... Rest> |
| std::string ArgsString(Rest... rest) { |
| std::stringstream args_buf; |
| AppendArgsString(args_buf, rest...); |
| return args_buf.str(); |
| } |
| |
| class ScopedTrace { |
| public: |
| explicit ScopedTrace(base::StringPiece name) : name_(name) { |
| EventTracer::GetInstance()->BeginTrace(name_, ""); |
| } |
| |
| template <typename... Rest> |
| ScopedTrace(base::StringPiece name, Rest... rest) : name_(name) { |
| EventTracer::GetInstance()->BeginTrace(name_, ArgsString(rest...)); |
| } |
| |
| ~ScopedTrace() { EventTracer::GetInstance()->EndTrace(name_, ""); } |
| |
| private: |
| base::StringPiece name_; |
| }; |
| |
| } // namespace tracer |
| |
| } // namespace cros |
| |
| #endif // CAMERA_HAL_ADAPTER_CAMERA_TRACE_EVENT_H_ |