From 2dec496f8092d2c5dea60b51d9057b0ebddfa66b Mon Sep 17 00:00:00 2001 From: Doudou Kisabaka Date: Thu, 28 Nov 2019 14:24:31 +0100 Subject: [PATCH] Add directive to make TRACE_EVENT macros optional. Bug: webrtc:11132 Change-Id: I801994ad262e1acff73e4c20afd7a7343b56268c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/160654 Commit-Queue: Doudou Kisabaka Reviewed-by: Mirko Bonadei Reviewed-by: Karl Wiberg Cr-Commit-Position: refs/heads/master@{#29949} --- BUILD.gn | 4 + modules/rtp_rtcp/source/rtp_sender_audio.cc | 4 + modules/rtp_rtcp/source/rtp_sender_video.cc | 4 + pc/rtc_stats_integrationtest.cc | 10 ++ rtc_base/event_tracer_unittest.cc | 34 ++--- rtc_base/trace_event.h | 156 ++++++++++++++++++-- webrtc.gni | 3 + 7 files changed, 188 insertions(+), 27 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index d79f5b72b6..5e9f832216 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -263,6 +263,10 @@ config("common_config") { defines += [ "RTC_DISABLE_LOGGING" ] } + if (rtc_disable_trace_events) { + defines += [ "RTC_DISABLE_TRACE_EVENTS" ] + } + if (build_with_chromium) { defines += [ # NOTICE: Since common_inherited_config is used in public_configs for our diff --git a/modules/rtp_rtcp/source/rtp_sender_audio.cc b/modules/rtp_rtcp/source/rtp_sender_audio.cc index 190bbd2afd..67e98f674f 100644 --- a/modules/rtp_rtcp/source/rtp_sender_audio.cc +++ b/modules/rtp_rtcp/source/rtp_sender_audio.cc @@ -30,6 +30,7 @@ namespace webrtc { namespace { +#if RTC_TRACE_EVENTS_ENABLED const char* FrameTypeToString(AudioFrameType frame_type) { switch (frame_type) { case AudioFrameType::kEmptyFrame: @@ -40,6 +41,7 @@ const char* FrameTypeToString(AudioFrameType frame_type) { return "audio_cn"; } } +#endif } // namespace @@ -133,8 +135,10 @@ bool RTPSenderAudio::SendAudio(AudioFrameType frame_type, uint32_t rtp_timestamp, const uint8_t* payload_data, size_t payload_size) { + #if RTC_TRACE_EVENTS_ENABLED TRACE_EVENT_ASYNC_STEP1("webrtc", "Audio", rtp_timestamp, "Send", "type", FrameTypeToString(frame_type)); + #endif // From RFC 4733: // A source has wide latitude as to how often it sends event updates. A diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc index 436962c38e..9592b06f16 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video.cc @@ -180,6 +180,7 @@ bool IsBaseLayer(const RTPVideoHeader& video_header) { return true; } +#if RTC_TRACE_EVENTS_ENABLED const char* FrameTypeToString(VideoFrameType frame_type) { switch (frame_type) { case VideoFrameType::kEmptyFrame: @@ -193,6 +194,7 @@ const char* FrameTypeToString(VideoFrameType frame_type) { return ""; } } +#endif } // namespace @@ -418,8 +420,10 @@ bool RTPSenderVideo::SendVideo( const RTPFragmentationHeader* fragmentation, RTPVideoHeader video_header, absl::optional expected_retransmission_time_ms) { + #if RTC_TRACE_EVENTS_ENABLED TRACE_EVENT_ASYNC_STEP1("webrtc", "Video", capture_time_ms, "Send", "type", FrameTypeToString(video_header.frame_type)); + #endif RTC_CHECK_RUNS_SERIALIZED(&send_checker_); if (video_header.frame_type == VideoFrameType::kEmptyFrame) diff --git a/pc/rtc_stats_integrationtest.cc b/pc/rtc_stats_integrationtest.cc index cd61678ed3..075dc63257 100644 --- a/pc/rtc_stats_integrationtest.cc +++ b/pc/rtc_stats_integrationtest.cc @@ -998,7 +998,10 @@ TEST_F(RTCStatsIntegrationTest, GetStatsFromCaller) { rtc::scoped_refptr report = GetStatsFromCaller(); RTCStatsReportVerifier(report.get()).VerifyReport({}); + + #if RTC_TRACE_EVENTS_ENABLED EXPECT_EQ(report->ToJson(), RTCStatsReportTraceListener::last_trace()); + #endif } TEST_F(RTCStatsIntegrationTest, GetStatsFromCallee) { @@ -1006,7 +1009,10 @@ TEST_F(RTCStatsIntegrationTest, GetStatsFromCallee) { rtc::scoped_refptr report = GetStatsFromCallee(); RTCStatsReportVerifier(report.get()).VerifyReport({}); + + #if RTC_TRACE_EVENTS_ENABLED EXPECT_EQ(report->ToJson(), RTCStatsReportTraceListener::last_trace()); + #endif } // These tests exercise the integration of the stats selection algorithm inside @@ -1086,8 +1092,10 @@ TEST_F(RTCStatsIntegrationTest, // Any pending stats requests should have completed in the act of destroying // the peer connection. ASSERT_TRUE(stats_obtainer->report()); + #if RTC_TRACE_EVENTS_ENABLED EXPECT_EQ(stats_obtainer->report()->ToJson(), RTCStatsReportTraceListener::last_trace()); + #endif } TEST_F(RTCStatsIntegrationTest, GetsStatsWhileClosingPeerConnection) { @@ -1099,8 +1107,10 @@ TEST_F(RTCStatsIntegrationTest, GetsStatsWhileClosingPeerConnection) { caller_->pc()->Close(); ASSERT_TRUE(stats_obtainer->report()); + #if RTC_TRACE_EVENTS_ENABLED EXPECT_EQ(stats_obtainer->report()->ToJson(), RTCStatsReportTraceListener::last_trace()); + #endif } // GetStatsReferencedIds() is optimized to recognize what is or isn't a diff --git a/rtc_base/event_tracer_unittest.cc b/rtc_base/event_tracer_unittest.cc index 2556d24fe5..79cc9c0788 100644 --- a/rtc_base/event_tracer_unittest.cc +++ b/rtc_base/event_tracer_unittest.cc @@ -45,22 +45,6 @@ class TestStatistics { int events_logged_ RTC_GUARDED_BY(crit_) = 0; }; -const unsigned char* GetCategoryEnabledHandler(const char* /*name*/) { - return reinterpret_cast("test"); -} - -void TraceEventHandler(char /*phase*/, - const unsigned char* /*category_enabled*/, - const char* /*name*/, - unsigned long long /*id*/, - int /*num_args*/, - const char** /*arg_names*/, - const unsigned char* /*arg_types*/, - const unsigned long long* /*arg_values*/, - unsigned char /*flags*/) { - TestStatistics::Get()->Increment(); -} - } // namespace namespace webrtc { @@ -71,11 +55,27 @@ TEST(EventTracerTest, EventTracerDisabled) { TestStatistics::Get()->Reset(); } +#if RTC_TRACE_EVENTS_ENABLED TEST(EventTracerTest, ScopedTraceEvent) { - SetupEventTracer(&GetCategoryEnabledHandler, &TraceEventHandler); + SetupEventTracer( + [](const char* /*name*/) { + return reinterpret_cast("test"); + }, + [](char /*phase*/, + const unsigned char* /*category_enabled*/, + const char* /*name*/, + unsigned long long /*id*/, + int /*num_args*/, + const char** /*arg_names*/, + const unsigned char* /*arg_types*/, + const unsigned long long* /*arg_values*/, + unsigned char /*flags*/) { + TestStatistics::Get()->Increment(); + }); { TRACE_EVENT0("test", "ScopedTraceEvent"); } EXPECT_EQ(2, TestStatistics::Get()->Count()); TestStatistics::Get()->Reset(); } +#endif } // namespace webrtc diff --git a/rtc_base/trace_event.h b/rtc_base/trace_event.h index fee9a7f766..a0b788fbf9 100644 --- a/rtc_base/trace_event.h +++ b/rtc_base/trace_event.h @@ -14,6 +14,23 @@ #error "Another copy of trace_event.h has already been included." #endif +#if defined(RTC_DISABLE_TRACE_EVENTS) +#define RTC_TRACE_EVENTS_ENABLED 0 +#else +#define RTC_TRACE_EVENTS_ENABLED 1 +#endif + +// Type values for identifying types in the TraceValue union. +#define TRACE_VALUE_TYPE_BOOL (static_cast(1)) +#define TRACE_VALUE_TYPE_UINT (static_cast(2)) +#define TRACE_VALUE_TYPE_INT (static_cast(3)) +#define TRACE_VALUE_TYPE_DOUBLE (static_cast(4)) +#define TRACE_VALUE_TYPE_POINTER (static_cast(5)) +#define TRACE_VALUE_TYPE_STRING (static_cast(6)) +#define TRACE_VALUE_TYPE_COPY_STRING (static_cast(7)) + +#if RTC_TRACE_EVENTS_ENABLED + // Extracted from Chromium's src/base/debug/trace_event.h. // This header is designed to give you trace_event macros without specifying @@ -626,15 +643,6 @@ #define TRACE_EVENT_FLAG_HAS_ID (static_cast(1 << 1)) #define TRACE_EVENT_FLAG_MANGLE_ID (static_cast(1 << 2)) -// Type values for identifying types in the TraceValue union. -#define TRACE_VALUE_TYPE_BOOL (static_cast(1)) -#define TRACE_VALUE_TYPE_UINT (static_cast(2)) -#define TRACE_VALUE_TYPE_INT (static_cast(3)) -#define TRACE_VALUE_TYPE_DOUBLE (static_cast(4)) -#define TRACE_VALUE_TYPE_POINTER (static_cast(5)) -#define TRACE_VALUE_TYPE_STRING (static_cast(6)) -#define TRACE_VALUE_TYPE_COPY_STRING (static_cast(7)) - namespace webrtc { namespace trace_event_internal { @@ -882,5 +890,133 @@ class TraceEndOnScopeClose { } // namespace trace_event_internal } // namespace webrtc +#else -#endif // RTC_BASE_TRACE_EVENT_H_ +//////////////////////////////////////////////////////////////////////////////// +// This section defines no-op alternatives to the tracing macros when +// RTC_DISABLE_TRACE_EVENTS is defined. + +#define RTC_NOOP() do {} while (0) + +#define TRACE_STR_COPY(str) RTC_NOOP() + +#define TRACE_DISABLED_BY_DEFAULT(name) "disabled-by-default-" name + +#define TRACE_ID_MANGLE(id) 0 + +#define TRACE_EVENT0(category, name) RTC_NOOP() +#define TRACE_EVENT1(category, name, arg1_name, arg1_val) RTC_NOOP() +#define TRACE_EVENT2(category, name, arg1_name, arg1_val, arg2_name, arg2_val) \ + RTC_NOOP() + +#define TRACE_EVENT_INSTANT0(category, name) RTC_NOOP() +#define TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) RTC_NOOP() + +#define TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() + +#define TRACE_EVENT_COPY_INSTANT0(category, name) RTC_NOOP() +#define TRACE_EVENT_COPY_INSTANT1(category, name, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_COPY_INSTANT2(category, name, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() + +#define TRACE_EVENT_BEGIN0(category, name) RTC_NOOP() +#define TRACE_EVENT_BEGIN1(category, name, arg1_name, arg1_val) RTC_NOOP() +#define TRACE_EVENT_BEGIN2(category, name, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() +#define TRACE_EVENT_COPY_BEGIN0(category, name) RTC_NOOP() +#define TRACE_EVENT_COPY_BEGIN1(category, name, arg1_name, arg1_val) RTC_NOOP() +#define TRACE_EVENT_COPY_BEGIN2(category, name, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() + +#define TRACE_EVENT_END0(category, name) RTC_NOOP() +#define TRACE_EVENT_END1(category, name, arg1_name, arg1_val) RTC_NOOP() +#define TRACE_EVENT_END2(category, name, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() +#define TRACE_EVENT_COPY_END0(category, name) RTC_NOOP() +#define TRACE_EVENT_COPY_END1(category, name, arg1_name, arg1_val) RTC_NOOP() +#define TRACE_EVENT_COPY_END2(category, name, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() + +#define TRACE_COUNTER1(category, name, value) RTC_NOOP() +#define TRACE_COPY_COUNTER1(category, name, value) RTC_NOOP() + +#define TRACE_COUNTER2(category, name, value1_name, value1_val, \ + value2_name, value2_val) RTC_NOOP() +#define TRACE_COPY_COUNTER2(category, name, value1_name, value1_val, \ + value2_name, value2_val) RTC_NOOP() + +#define TRACE_COUNTER_ID1(category, name, id, value) RTC_NOOP() +#define TRACE_COPY_COUNTER_ID1(category, name, id, value) RTC_NOOP() + +#define TRACE_COUNTER_ID2(category, name, id, value1_name, value1_val, \ + value2_name, value2_val) RTC_NOOP() +#define TRACE_COPY_COUNTER_ID2(category, name, id, value1_name, value1_val, \ + value2_name, value2_val) RTC_NOOP() + +#define TRACE_EVENT_ASYNC_BEGIN0(category, name, id) RTC_NOOP() +#define TRACE_EVENT_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_ASYNC_BEGIN2(category, name, id, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() +#define TRACE_EVENT_COPY_ASYNC_BEGIN0(category, name, id) RTC_NOOP() +#define TRACE_EVENT_COPY_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_COPY_ASYNC_BEGIN2(category, name, id, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() + +#define TRACE_EVENT_ASYNC_STEP0(category, name, id, step) RTC_NOOP() +#define TRACE_EVENT_ASYNC_STEP1(category, name, id, step, \ + arg1_name, arg1_val) RTC_NOOP() +#define TRACE_EVENT_COPY_ASYNC_STEP0(category, name, id, step) RTC_NOOP() +#define TRACE_EVENT_COPY_ASYNC_STEP1(category, name, id, step, \ + arg1_name, arg1_val) RTC_NOOP() + +#define TRACE_EVENT_ASYNC_END0(category, name, id) RTC_NOOP() +#define TRACE_EVENT_ASYNC_END1(category, name, id, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_ASYNC_END2(category, name, id, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() +#define TRACE_EVENT_COPY_ASYNC_END0(category, name, id) RTC_NOOP() +#define TRACE_EVENT_COPY_ASYNC_END1(category, name, id, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_COPY_ASYNC_END2(category, name, id, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() + +#define TRACE_EVENT_FLOW_BEGIN0(category, name, id) RTC_NOOP() +#define TRACE_EVENT_FLOW_BEGIN1(category, name, id, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_FLOW_BEGIN2(category, name, id, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() +#define TRACE_EVENT_COPY_FLOW_BEGIN0(category, name, id) RTC_NOOP() +#define TRACE_EVENT_COPY_FLOW_BEGIN1(category, name, id, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_COPY_FLOW_BEGIN2(category, name, id, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() + +#define TRACE_EVENT_FLOW_STEP0(category, name, id, step) RTC_NOOP() +#define TRACE_EVENT_FLOW_STEP1(category, name, id, step, \ + arg1_name, arg1_val) RTC_NOOP() +#define TRACE_EVENT_COPY_FLOW_STEP0(category, name, id, step) RTC_NOOP() +#define TRACE_EVENT_COPY_FLOW_STEP1(category, name, id, step, \ + arg1_name, arg1_val) RTC_NOOP() + +#define TRACE_EVENT_FLOW_END0(category, name, id) RTC_NOOP() +#define TRACE_EVENT_FLOW_END1(category, name, id, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_FLOW_END2(category, name, id, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() +#define TRACE_EVENT_COPY_FLOW_END0(category, name, id) RTC_NOOP() +#define TRACE_EVENT_COPY_FLOW_END1(category, name, id, arg1_name, arg1_val) \ + RTC_NOOP() +#define TRACE_EVENT_COPY_FLOW_END2(category, name, id, arg1_name, arg1_val, \ + arg2_name, arg2_val) RTC_NOOP() + +#define TRACE_EVENT_API_GET_CATEGORY_ENABLED "" + +#define TRACE_EVENT_API_ADD_TRACE_EVENT RTC_NOOP() + +#endif // RTC_TRACE_EVENTS_ENABLED + +#endif // RTC_BASE_TRACE_EVENT_H_ \ No newline at end of file diff --git a/webrtc.gni b/webrtc.gni index 5dabc44c65..2aefe251b1 100644 --- a/webrtc.gni +++ b/webrtc.gni @@ -245,6 +245,9 @@ declare_args() { # Set this to true to fully remove logging from WebRTC. rtc_disable_logging = false + + # Set this to true to disable trace events. + rtc_disable_trace_events = false } # Make it possible to provide custom locations for some libraries (move these