From 83db78e854ff35d57124f04aff9464c0862cd833 Mon Sep 17 00:00:00 2001 From: Ali Tofigh Date: Tue, 23 Aug 2022 12:57:16 +0200 Subject: [PATCH] Add TaskQueueStdlib experiment. Bug: webrtc:14389 Change-Id: I23c6e0ae675748ec35a99c334104dd2654995a33 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265802 Commit-Queue: Ali Tofigh Reviewed-by: Harald Alvestrand Reviewed-by: Tomas Gunnarsson Reviewed-by: Jonas Oreland Cr-Commit-Position: refs/heads/main@{#37888} --- api/create_peerconnection_factory.cc | 13 ++++--- api/task_queue/BUILD.gn | 23 +++++++++-- api/task_queue/default_task_queue_factory.h | 4 +- .../default_task_queue_factory_gcd.cc | 4 +- .../default_task_queue_factory_libevent.cc | 4 +- .../default_task_queue_factory_stdlib.cc | 4 +- ...e_factory_stdlib_or_libevent_experiment.cc | 38 +++++++++++++++++++ .../default_task_queue_factory_win.cc | 4 +- api/task_queue/task_queue_test.cc | 23 +++++------ api/task_queue/task_queue_test.h | 7 ++-- rtc_base/BUILD.gn | 1 + rtc_base/thread_unittest.cc | 8 +++- rtc_tools/video_replay.cc | 13 ++++--- .../RTCPeerConnectionFactory.mm | 3 +- 14 files changed, 113 insertions(+), 36 deletions(-) create mode 100644 api/task_queue/default_task_queue_factory_stdlib_or_libevent_experiment.cc diff --git a/api/create_peerconnection_factory.cc b/api/create_peerconnection_factory.cc index 4a01b2f3c9..f9cc7ad3e2 100644 --- a/api/create_peerconnection_factory.cc +++ b/api/create_peerconnection_factory.cc @@ -40,19 +40,20 @@ rtc::scoped_refptr CreatePeerConnectionFactory( rtc::scoped_refptr audio_processing, AudioFrameProcessor* audio_frame_processor, std::unique_ptr field_trials) { + if (!field_trials) { + field_trials = std::make_unique(); + } + PeerConnectionFactoryDependencies dependencies; dependencies.network_thread = network_thread; dependencies.worker_thread = worker_thread; dependencies.signaling_thread = signaling_thread; - dependencies.task_queue_factory = CreateDefaultTaskQueueFactory(); + dependencies.task_queue_factory = + CreateDefaultTaskQueueFactory(field_trials.get()); dependencies.call_factory = CreateCallFactory(); dependencies.event_log_factory = std::make_unique( dependencies.task_queue_factory.get()); - if (field_trials) { - dependencies.trials = std::move(field_trials); - } else { - dependencies.trials = std::make_unique(); - } + dependencies.trials = std::move(field_trials); if (network_thread) { // TODO(bugs.webrtc.org/13145): Add an rtc::SocketFactory* argument. diff --git a/api/task_queue/BUILD.gn b/api/task_queue/BUILD.gn index 8daa01d26b..2406bc0c78 100644 --- a/api/task_queue/BUILD.gn +++ b/api/task_queue/BUILD.gn @@ -61,7 +61,9 @@ rtc_library("task_queue_test") { ] } else { deps = [ + ":default_task_queue_factory", ":task_queue", + "../../api:field_trials_view", "../../api/units:time_delta", "../../rtc_base:refcount", "../../rtc_base:rtc_event", @@ -81,11 +83,26 @@ rtc_library("default_task_queue_factory") { poisonous = [ "default_task_queue" ] } sources = [ "default_task_queue_factory.h" ] - deps = [ ":task_queue" ] + deps = [ + ":task_queue", + "../../api:field_trials_view", + "../../rtc_base/memory:always_valid_pointer", + ] if (rtc_enable_libevent) { - sources += [ "default_task_queue_factory_libevent.cc" ] - deps += [ "../../rtc_base:rtc_task_queue_libevent" ] + if (is_android) { + sources += + [ "default_task_queue_factory_stdlib_or_libevent_experiment.cc" ] + deps += [ + "../../api/transport:field_trial_based_config", + "../../rtc_base:logging", + "../../rtc_base:rtc_task_queue_libevent", + "../../rtc_base:rtc_task_queue_stdlib", + ] + } else { + sources += [ "default_task_queue_factory_libevent.cc" ] + deps += [ "../../rtc_base:rtc_task_queue_libevent" ] + } } else if (is_mac || is_ios) { sources += [ "default_task_queue_factory_gcd.cc" ] deps += [ "../../rtc_base:rtc_task_queue_gcd" ] diff --git a/api/task_queue/default_task_queue_factory.h b/api/task_queue/default_task_queue_factory.h index ccdd1ebec0..1d2dbd7ec2 100644 --- a/api/task_queue/default_task_queue_factory.h +++ b/api/task_queue/default_task_queue_factory.h @@ -12,11 +12,13 @@ #include +#include "api/field_trials_view.h" #include "api/task_queue/task_queue_factory.h" namespace webrtc { -std::unique_ptr CreateDefaultTaskQueueFactory(); +std::unique_ptr CreateDefaultTaskQueueFactory( + const FieldTrialsView* field_trials = nullptr); } // namespace webrtc diff --git a/api/task_queue/default_task_queue_factory_gcd.cc b/api/task_queue/default_task_queue_factory_gcd.cc index 7e17b4846d..391f09b393 100644 --- a/api/task_queue/default_task_queue_factory_gcd.cc +++ b/api/task_queue/default_task_queue_factory_gcd.cc @@ -9,12 +9,14 @@ */ #include +#include "api/field_trials_view.h" #include "api/task_queue/task_queue_factory.h" #include "rtc_base/task_queue_gcd.h" namespace webrtc { -std::unique_ptr CreateDefaultTaskQueueFactory() { +std::unique_ptr CreateDefaultTaskQueueFactory( + const FieldTrialsView* field_trials) { return CreateTaskQueueGcdFactory(); } diff --git a/api/task_queue/default_task_queue_factory_libevent.cc b/api/task_queue/default_task_queue_factory_libevent.cc index f2fb418fd3..89079f51ca 100644 --- a/api/task_queue/default_task_queue_factory_libevent.cc +++ b/api/task_queue/default_task_queue_factory_libevent.cc @@ -9,12 +9,14 @@ */ #include +#include "api/field_trials_view.h" #include "api/task_queue/task_queue_factory.h" #include "rtc_base/task_queue_libevent.h" namespace webrtc { -std::unique_ptr CreateDefaultTaskQueueFactory() { +std::unique_ptr CreateDefaultTaskQueueFactory( + const FieldTrialsView* field_trials) { return CreateTaskQueueLibeventFactory(); } diff --git a/api/task_queue/default_task_queue_factory_stdlib.cc b/api/task_queue/default_task_queue_factory_stdlib.cc index ca7d720cbe..10cda7c5ec 100644 --- a/api/task_queue/default_task_queue_factory_stdlib.cc +++ b/api/task_queue/default_task_queue_factory_stdlib.cc @@ -9,12 +9,14 @@ */ #include +#include "api/field_trials_view.h" #include "api/task_queue/task_queue_factory.h" #include "rtc_base/task_queue_stdlib.h" namespace webrtc { -std::unique_ptr CreateDefaultTaskQueueFactory() { +std::unique_ptr CreateDefaultTaskQueueFactory( + const FieldTrialsView* field_trials) { return CreateTaskQueueStdlibFactory(); } diff --git a/api/task_queue/default_task_queue_factory_stdlib_or_libevent_experiment.cc b/api/task_queue/default_task_queue_factory_stdlib_or_libevent_experiment.cc new file mode 100644 index 0000000000..dc6e835907 --- /dev/null +++ b/api/task_queue/default_task_queue_factory_stdlib_or_libevent_experiment.cc @@ -0,0 +1,38 @@ +/* + * Copyright 2022 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include + +#include "api/field_trials_view.h" +#include "api/task_queue/task_queue_factory.h" +#include "api/transport/field_trial_based_config.h" +#include "rtc_base/logging.h" +#include "rtc_base/memory/always_valid_pointer.h" +#include "rtc_base/task_queue_libevent.h" +#include "rtc_base/task_queue_stdlib.h" + +namespace webrtc { + +std::unique_ptr CreateDefaultTaskQueueFactory( + const FieldTrialsView* field_trials_view) { + AlwaysValidPointer field_trials( + field_trials_view); + if (field_trials->IsEnabled("WebRTC-TaskQueue-ReplaceLibeventWithStdlib")) { + RTC_LOG(LS_INFO) << "WebRTC-TaskQueue-ReplaceLibeventWithStdlib: " + << "using TaskQueueStdlibFactory."; + return CreateTaskQueueStdlibFactory(); + } + + RTC_LOG(LS_INFO) << "WebRTC-TaskQueue-ReplaceLibeventWithStdlib: " + << "using TaskQueueLibeventFactory."; + return CreateTaskQueueLibeventFactory(); +} + +} // namespace webrtc diff --git a/api/task_queue/default_task_queue_factory_win.cc b/api/task_queue/default_task_queue_factory_win.cc index 493ea66ea5..e3adc07327 100644 --- a/api/task_queue/default_task_queue_factory_win.cc +++ b/api/task_queue/default_task_queue_factory_win.cc @@ -9,12 +9,14 @@ */ #include +#include "api/field_trials_view.h" #include "api/task_queue/task_queue_factory.h" #include "rtc_base/task_queue_win.h" namespace webrtc { -std::unique_ptr CreateDefaultTaskQueueFactory() { +std::unique_ptr CreateDefaultTaskQueueFactory( + const FieldTrialsView* field_trials) { return CreateTaskQueueWinFactory(); } diff --git a/api/task_queue/task_queue_test.cc b/api/task_queue/task_queue_test.cc index 69532d61f4..0f6b1d013f 100644 --- a/api/task_queue/task_queue_test.cc +++ b/api/task_queue/task_queue_test.cc @@ -13,6 +13,7 @@ #include "absl/cleanup/cleanup.h" #include "absl/strings/string_view.h" +#include "api/task_queue/default_task_queue_factory.h" #include "api/units/time_delta.h" #include "rtc_base/event.h" #include "rtc_base/ref_counter.h" @@ -29,13 +30,13 @@ std::unique_ptr CreateTaskQueue( } TEST_P(TaskQueueTest, Construct) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); auto queue = CreateTaskQueue(factory, "Construct"); EXPECT_FALSE(queue->IsCurrent()); } TEST_P(TaskQueueTest, PostAndCheckCurrent) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); rtc::Event event; auto queue = CreateTaskQueue(factory, "PostAndCheckCurrent"); @@ -53,7 +54,7 @@ TEST_P(TaskQueueTest, PostAndCheckCurrent) { } TEST_P(TaskQueueTest, PostCustomTask) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); rtc::Event ran; auto queue = CreateTaskQueue(factory, "PostCustomImplementation"); @@ -72,7 +73,7 @@ TEST_P(TaskQueueTest, PostCustomTask) { } TEST_P(TaskQueueTest, PostDelayedZero) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); rtc::Event event; auto queue = CreateTaskQueue(factory, "PostDelayedZero"); @@ -81,7 +82,7 @@ TEST_P(TaskQueueTest, PostDelayedZero) { } TEST_P(TaskQueueTest, PostFromQueue) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); rtc::Event event; auto queue = CreateTaskQueue(factory, "PostFromQueue"); @@ -91,7 +92,7 @@ TEST_P(TaskQueueTest, PostFromQueue) { } TEST_P(TaskQueueTest, PostDelayed) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); rtc::Event event; auto queue = CreateTaskQueue(factory, "PostDelayed", TaskQueueFactory::Priority::HIGH); @@ -113,7 +114,7 @@ TEST_P(TaskQueueTest, PostDelayed) { } TEST_P(TaskQueueTest, PostMultipleDelayed) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); auto queue = CreateTaskQueue(factory, "PostMultipleDelayed"); std::vector events(100); @@ -132,7 +133,7 @@ TEST_P(TaskQueueTest, PostMultipleDelayed) { } TEST_P(TaskQueueTest, PostDelayedAfterDestruct) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); rtc::Event run; rtc::Event deleted; auto queue = CreateTaskQueue(factory, "PostDelayedAfterDestruct"); @@ -147,7 +148,7 @@ TEST_P(TaskQueueTest, PostDelayedAfterDestruct) { } TEST_P(TaskQueueTest, PostAndReuse) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); rtc::Event event; auto post_queue = CreateTaskQueue(factory, "PostQueue"); auto reply_queue = CreateTaskQueue(factory, "ReplyQueue"); @@ -203,7 +204,7 @@ TEST_P(TaskQueueTest, PostALot) { rtc::Event event_; }; - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); static constexpr int kTaskCount = 0xffff; rtc::Event posting_done; BlockingCounter all_destroyed(kTaskCount); @@ -247,7 +248,7 @@ TEST_P(TaskQueueTest, PostALot) { // unit test, run it under TSan or some other tool that is able to // directly detect data races. TEST_P(TaskQueueTest, PostTwoWithSharedUnprotectedState) { - std::unique_ptr factory = GetParam()(); + std::unique_ptr factory = GetParam()(nullptr); struct SharedState { // First task will set this value to 1 and second will assert it. int state = 0; diff --git a/api/task_queue/task_queue_test.h b/api/task_queue/task_queue_test.h index e2e473017f..214f95008f 100644 --- a/api/task_queue/task_queue_test.h +++ b/api/task_queue/task_queue_test.h @@ -13,6 +13,7 @@ #include #include +#include "api/field_trials_view.h" #include "api/task_queue/task_queue_factory.h" #include "test/gtest.h" @@ -31,9 +32,9 @@ namespace webrtc { // INSTANTIATE_TEST_SUITE_P(My, TaskQueueTest, Values(CreateMyFactory)); // // } // namespace -class TaskQueueTest : public ::testing::TestWithParam< - std::function()>> { -}; +class TaskQueueTest + : public ::testing::TestWithParam(const FieldTrialsView*)>> {}; } // namespace webrtc diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 078c9ea151..6eb3622eef 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -1752,6 +1752,7 @@ if (rtc_include_tests) { ":threading", ":timeutils", "../api:array_view", + "../api:field_trials_view", "../api:make_ref_counted", "../api/task_queue", "../api/task_queue:pending_task_safety_flag", diff --git a/rtc_base/thread_unittest.cc b/rtc_base/thread_unittest.cc index 75f13d4016..b06b09e235 100644 --- a/rtc_base/thread_unittest.cc +++ b/rtc_base/thread_unittest.cc @@ -12,6 +12,7 @@ #include +#include "api/field_trials_view.h" #include "api/task_queue/task_queue_factory.h" #include "api/task_queue/task_queue_test.h" #include "api/units/time_delta.h" @@ -1138,11 +1139,16 @@ class ThreadFactory : public webrtc::TaskQueueFactory { } }; +std::unique_ptr CreateDefaultThreadFactory( + const webrtc::FieldTrialsView*) { + return std::make_unique(); +} + using ::webrtc::TaskQueueTest; INSTANTIATE_TEST_SUITE_P(RtcThread, TaskQueueTest, - ::testing::Values(std::make_unique)); + ::testing::Values(CreateDefaultThreadFactory)); } // namespace } // namespace rtc diff --git a/rtc_tools/video_replay.cc b/rtc_tools/video_replay.cc index 7d331ad366..1a7bfadbca 100644 --- a/rtc_tools/video_replay.cc +++ b/rtc_tools/video_replay.cc @@ -340,21 +340,22 @@ class RtpReplayer final { // Replay a rtp dump with an optional json configuration. static void Replay(const std::string& replay_config_path, const std::string& rtp_dump_path) { + webrtc::RtcEventLogNull event_log; + Call::Config call_config(&event_log); + call_config.trials = new FieldTrialBasedConfig(); + std::unique_ptr task_queue_factory = - webrtc::CreateDefaultTaskQueueFactory(); + webrtc::CreateDefaultTaskQueueFactory(call_config.trials); auto worker_thread = task_queue_factory->CreateTaskQueue( "worker_thread", TaskQueueFactory::Priority::NORMAL); rtc::Event sync_event(/*manual_reset=*/false, /*initially_signalled=*/false); - webrtc::RtcEventLogNull event_log; - Call::Config call_config(&event_log); call_config.task_queue_factory = task_queue_factory.get(); - call_config.trials = new FieldTrialBasedConfig(); - std::unique_ptr call; - std::unique_ptr stream_state; // Creation of the streams must happen inside a task queue because it is // resued as a worker thread. + std::unique_ptr call; + std::unique_ptr stream_state; worker_thread->PostTask([&]() { call.reset(Call::Create(call_config)); diff --git a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm index 84c5f020b5..e2215c8b45 100644 --- a/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm +++ b/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm @@ -173,8 +173,9 @@ if (webrtc::field_trial::IsEnabled("WebRTC-Network-UseNWPathMonitor")) { dependencies.network_monitor_factory = webrtc::CreateNetworkMonitorFactory(); } - dependencies.task_queue_factory = webrtc::CreateDefaultTaskQueueFactory(); dependencies.trials = std::make_unique(); + dependencies.task_queue_factory = + webrtc::CreateDefaultTaskQueueFactory(dependencies.trials.get()); cricket::MediaEngineDependencies media_deps; media_deps.adm = std::move(audioDeviceModule); media_deps.task_queue_factory = dependencies.task_queue_factory.get();