Add performance tracing for API calls (inside api proxies).
No-Try: true
Bug: webrtc:12787
Change-Id: Ica2a997077cc76bb24a4c70e5475e491fe44f29e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219692
Commit-Queue: Tommi <tommi@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34077}
diff --git a/api/proxy.cc b/api/proxy.cc
index 67318e7..a7653ce 100644
--- a/api/proxy.cc
+++ b/api/proxy.cc
@@ -10,3 +10,12 @@
#include "api/proxy.h"
+#include "rtc_base/trace_event.h"
+
+namespace webrtc {
+namespace proxy_internal {
+void TraceApiCall(const char* class_name, const char* method_name) {
+ TRACE_EVENT1("webrtc", class_name, "method", method_name);
+}
+} // namespace proxy_internal
+} // namespace webrtc
diff --git a/api/proxy.h b/api/proxy.h
index d14e0b2..5e730d9b 100644
--- a/api/proxy.h
+++ b/api/proxy.h
@@ -79,6 +79,9 @@
}
namespace webrtc {
+namespace proxy_internal {
+RTC_EXPORT void TraceApiCall(const char* class_name, const char* method_name);
+} // namespace proxy_internal
template <typename R>
class ReturnType {
@@ -181,6 +184,9 @@
rtc::Event event_;
};
+#define PROXY_STRINGIZE_IMPL(x) #x
+#define PROXY_STRINGIZE(x) PROXY_STRINGIZE_IMPL(x)
+
// Helper macros to reduce code duplication.
#define PROXY_MAP_BOILERPLATE(c) \
template <class INTERNAL_CLASS> \
@@ -190,6 +196,7 @@
class c##ProxyWithInternal : public c##Interface { \
protected: \
typedef c##Interface C; \
+ const char* class_name_ = PROXY_STRINGIZE(c); \
\
public: \
const INTERNAL_CLASS* internal() const { return c_; } \
@@ -299,46 +306,53 @@
\
public: // NOLINTNEXTLINE
-#define PROXY_METHOD0(r, method) \
- r method() override { \
- MethodCall<C, r> call(c_, &C::method); \
- return call.Marshal(RTC_FROM_HERE, primary_thread_); \
+#define PROXY_METHOD0(r, method) \
+ r method() override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ MethodCall<C, r> call(c_, &C::method); \
+ return call.Marshal(RTC_FROM_HERE, primary_thread_); \
}
-#define PROXY_CONSTMETHOD0(r, method) \
- r method() const override { \
- ConstMethodCall<C, r> call(c_, &C::method); \
- return call.Marshal(RTC_FROM_HERE, primary_thread_); \
+#define PROXY_CONSTMETHOD0(r, method) \
+ r method() const override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ ConstMethodCall<C, r> call(c_, &C::method); \
+ return call.Marshal(RTC_FROM_HERE, primary_thread_); \
}
-#define PROXY_METHOD1(r, method, t1) \
- r method(t1 a1) override { \
- MethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
- return call.Marshal(RTC_FROM_HERE, primary_thread_); \
+#define PROXY_METHOD1(r, method, t1) \
+ r method(t1 a1) override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ MethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
+ return call.Marshal(RTC_FROM_HERE, primary_thread_); \
}
-#define PROXY_CONSTMETHOD1(r, method, t1) \
- r method(t1 a1) const override { \
- ConstMethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
- return call.Marshal(RTC_FROM_HERE, primary_thread_); \
+#define PROXY_CONSTMETHOD1(r, method, t1) \
+ r method(t1 a1) const override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ ConstMethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
+ return call.Marshal(RTC_FROM_HERE, primary_thread_); \
}
-#define PROXY_METHOD2(r, method, t1, t2) \
- r method(t1 a1, t2 a2) override { \
- MethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
- std::move(a2)); \
- return call.Marshal(RTC_FROM_HERE, primary_thread_); \
+#define PROXY_METHOD2(r, method, t1, t2) \
+ r method(t1 a1, t2 a2) override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ MethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
+ std::move(a2)); \
+ return call.Marshal(RTC_FROM_HERE, primary_thread_); \
}
-#define PROXY_METHOD3(r, method, t1, t2, t3) \
- r method(t1 a1, t2 a2, t3 a3) override { \
- MethodCall<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
- std::move(a2), std::move(a3)); \
- return call.Marshal(RTC_FROM_HERE, primary_thread_); \
+#define PROXY_METHOD3(r, method, t1, t2, t3) \
+ r method(t1 a1, t2 a2, t3 a3) override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ MethodCall<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
+ std::move(a2), std::move(a3)); \
+ return call.Marshal(RTC_FROM_HERE, primary_thread_); \
}
#define PROXY_METHOD4(r, method, t1, t2, t3, t4) \
r method(t1 a1, t2 a2, t3 a3, t4 a4) override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
MethodCall<C, r, t1, t2, t3, t4> call(c_, &C::method, std::move(a1), \
std::move(a2), std::move(a3), \
std::move(a4)); \
@@ -347,6 +361,7 @@
#define PROXY_METHOD5(r, method, t1, t2, t3, t4, t5) \
r method(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
MethodCall<C, r, t1, t2, t3, t4, t5> call(c_, &C::method, std::move(a1), \
std::move(a2), std::move(a3), \
std::move(a4), std::move(a5)); \
@@ -354,53 +369,61 @@
}
// Define methods which should be invoked on the secondary thread.
-#define PROXY_SECONDARY_METHOD0(r, method) \
- r method() override { \
- MethodCall<C, r> call(c_, &C::method); \
- return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
+#define PROXY_SECONDARY_METHOD0(r, method) \
+ r method() override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ MethodCall<C, r> call(c_, &C::method); \
+ return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
}
-#define PROXY_SECONDARY_CONSTMETHOD0(r, method) \
- r method() const override { \
- ConstMethodCall<C, r> call(c_, &C::method); \
- return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
+#define PROXY_SECONDARY_CONSTMETHOD0(r, method) \
+ r method() const override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ ConstMethodCall<C, r> call(c_, &C::method); \
+ return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
}
-#define PROXY_SECONDARY_METHOD1(r, method, t1) \
- r method(t1 a1) override { \
- MethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
- return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
+#define PROXY_SECONDARY_METHOD1(r, method, t1) \
+ r method(t1 a1) override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ MethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
+ return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
}
-#define PROXY_SECONDARY_CONSTMETHOD1(r, method, t1) \
- r method(t1 a1) const override { \
- ConstMethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
- return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
+#define PROXY_SECONDARY_CONSTMETHOD1(r, method, t1) \
+ r method(t1 a1) const override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ ConstMethodCall<C, r, t1> call(c_, &C::method, std::move(a1)); \
+ return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
}
-#define PROXY_SECONDARY_METHOD2(r, method, t1, t2) \
- r method(t1 a1, t2 a2) override { \
- MethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
- std::move(a2)); \
- return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
+#define PROXY_SECONDARY_METHOD2(r, method, t1, t2) \
+ r method(t1 a1, t2 a2) override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ MethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
+ std::move(a2)); \
+ return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
}
-#define PROXY_SECONDARY_CONSTMETHOD2(r, method, t1, t2) \
- r method(t1 a1, t2 a2) const override { \
- ConstMethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
- std::move(a2)); \
- return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
+#define PROXY_SECONDARY_CONSTMETHOD2(r, method, t1, t2) \
+ r method(t1 a1, t2 a2) const override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ ConstMethodCall<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
+ std::move(a2)); \
+ return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
}
-#define PROXY_SECONDARY_METHOD3(r, method, t1, t2, t3) \
- r method(t1 a1, t2 a2, t3 a3) override { \
- MethodCall<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
- std::move(a2), std::move(a3)); \
- return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
+#define PROXY_SECONDARY_METHOD3(r, method, t1, t2, t3) \
+ r method(t1 a1, t2 a2, t3 a3) override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
+ MethodCall<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
+ std::move(a2), std::move(a3)); \
+ return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
}
#define PROXY_SECONDARY_CONSTMETHOD3(r, method, t1, t2) \
r method(t1 a1, t2 a2, t3 a3) const override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
ConstMethodCall<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
std::move(a2), std::move(a3)); \
return call.Marshal(RTC_FROM_HERE, secondary_thread_); \
@@ -411,6 +434,7 @@
// always be the same.
#define BYPASS_PROXY_CONSTMETHOD0(r, method) \
r method() const override { \
+ proxy_internal::TraceApiCall(class_name_, PROXY_STRINGIZE(method)); \
static_assert( \
std::is_same<r, rtc::Thread*>::value || !std::is_pointer<r>::value, \
"Type is a pointer"); \