Reland "Add TaskQueueStdlib experiment."
This is a reland of commit 83db78e854ff35d57124f04aff9464c0862cd833
Original change's description:
> Add TaskQueueStdlib experiment.
>
> Bug: webrtc:14389
> Change-Id: I23c6e0ae675748ec35a99c334104dd2654995a33
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265802
> Commit-Queue: Ali Tofigh <alito@webrtc.org>
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
> Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#37888}
Bug: webrtc:14389
Change-Id: If84c7043e5f0f63ae8d9eae651daf900a72f2ee3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/273320
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Ali Tofigh <alito@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37923}
diff --git a/api/create_peerconnection_factory.cc b/api/create_peerconnection_factory.cc
index 4a01b2f..f9cc7ad 100644
--- a/api/create_peerconnection_factory.cc
+++ b/api/create_peerconnection_factory.cc
@@ -40,19 +40,20 @@
rtc::scoped_refptr<AudioProcessing> audio_processing,
AudioFrameProcessor* audio_frame_processor,
std::unique_ptr<FieldTrialsView> field_trials) {
+ if (!field_trials) {
+ field_trials = std::make_unique<webrtc::FieldTrialBasedConfig>();
+ }
+
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<RtcEventLogFactory>(
dependencies.task_queue_factory.get());
- if (field_trials) {
- dependencies.trials = std::move(field_trials);
- } else {
- dependencies.trials = std::make_unique<webrtc::FieldTrialBasedConfig>();
- }
+ 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 8daa01d..2406bc0 100644
--- a/api/task_queue/BUILD.gn
+++ b/api/task_queue/BUILD.gn
@@ -61,7 +61,9 @@
]
} 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 @@
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 ccdd1eb..1d2dbd7 100644
--- a/api/task_queue/default_task_queue_factory.h
+++ b/api/task_queue/default_task_queue_factory.h
@@ -12,11 +12,13 @@
#include <memory>
+#include "api/field_trials_view.h"
#include "api/task_queue/task_queue_factory.h"
namespace webrtc {
-std::unique_ptr<TaskQueueFactory> CreateDefaultTaskQueueFactory();
+std::unique_ptr<TaskQueueFactory> 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 7e17b48..391f09b 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 <memory>
+#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<TaskQueueFactory> CreateDefaultTaskQueueFactory() {
+std::unique_ptr<TaskQueueFactory> 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 f2fb418..89079f5 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 <memory>
+#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<TaskQueueFactory> CreateDefaultTaskQueueFactory() {
+std::unique_ptr<TaskQueueFactory> 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 ca7d720..10cda7c 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 <memory>
+#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<TaskQueueFactory> CreateDefaultTaskQueueFactory() {
+std::unique_ptr<TaskQueueFactory> 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 0000000..dc6e835
--- /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 <memory>
+
+#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<TaskQueueFactory> CreateDefaultTaskQueueFactory(
+ const FieldTrialsView* field_trials_view) {
+ AlwaysValidPointer<const FieldTrialsView, FieldTrialBasedConfig> 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 493ea66..e3adc07 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 <memory>
+#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<TaskQueueFactory> CreateDefaultTaskQueueFactory() {
+std::unique_ptr<TaskQueueFactory> 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 69532d6..0f6b1d0 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 @@
}
TEST_P(TaskQueueTest, Construct) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
auto queue = CreateTaskQueue(factory, "Construct");
EXPECT_FALSE(queue->IsCurrent());
}
TEST_P(TaskQueueTest, PostAndCheckCurrent) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
rtc::Event event;
auto queue = CreateTaskQueue(factory, "PostAndCheckCurrent");
@@ -53,7 +54,7 @@
}
TEST_P(TaskQueueTest, PostCustomTask) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
rtc::Event ran;
auto queue = CreateTaskQueue(factory, "PostCustomImplementation");
@@ -72,7 +73,7 @@
}
TEST_P(TaskQueueTest, PostDelayedZero) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
rtc::Event event;
auto queue = CreateTaskQueue(factory, "PostDelayedZero");
@@ -81,7 +82,7 @@
}
TEST_P(TaskQueueTest, PostFromQueue) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
rtc::Event event;
auto queue = CreateTaskQueue(factory, "PostFromQueue");
@@ -91,7 +92,7 @@
}
TEST_P(TaskQueueTest, PostDelayed) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
rtc::Event event;
auto queue =
CreateTaskQueue(factory, "PostDelayed", TaskQueueFactory::Priority::HIGH);
@@ -113,7 +114,7 @@
}
TEST_P(TaskQueueTest, PostMultipleDelayed) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
auto queue = CreateTaskQueue(factory, "PostMultipleDelayed");
std::vector<rtc::Event> events(100);
@@ -132,7 +133,7 @@
}
TEST_P(TaskQueueTest, PostDelayedAfterDestruct) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
rtc::Event run;
rtc::Event deleted;
auto queue = CreateTaskQueue(factory, "PostDelayedAfterDestruct");
@@ -147,7 +148,7 @@
}
TEST_P(TaskQueueTest, PostAndReuse) {
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
rtc::Event event;
auto post_queue = CreateTaskQueue(factory, "PostQueue");
auto reply_queue = CreateTaskQueue(factory, "ReplyQueue");
@@ -203,7 +204,7 @@
rtc::Event event_;
};
- std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> factory = GetParam()(nullptr);
static constexpr int kTaskCount = 0xffff;
rtc::Event posting_done;
BlockingCounter all_destroyed(kTaskCount);
@@ -247,7 +248,7 @@
// 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<webrtc::TaskQueueFactory> factory = GetParam()();
+ std::unique_ptr<webrtc::TaskQueueFactory> 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 e2e4730..214f950 100644
--- a/api/task_queue/task_queue_test.h
+++ b/api/task_queue/task_queue_test.h
@@ -13,6 +13,7 @@
#include <functional>
#include <memory>
+#include "api/field_trials_view.h"
#include "api/task_queue/task_queue_factory.h"
#include "test/gtest.h"
@@ -31,9 +32,9 @@
// INSTANTIATE_TEST_SUITE_P(My, TaskQueueTest, Values(CreateMyFactory));
//
// } // namespace
-class TaskQueueTest : public ::testing::TestWithParam<
- std::function<std::unique_ptr<TaskQueueFactory>()>> {
-};
+class TaskQueueTest
+ : public ::testing::TestWithParam<std::function<
+ std::unique_ptr<TaskQueueFactory>(const FieldTrialsView*)>> {};
} // namespace webrtc
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 9938be8..b7a9ec4 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -1758,6 +1758,7 @@
":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 a800671..a6b2494 100644
--- a/rtc_base/thread_unittest.cc
+++ b/rtc_base/thread_unittest.cc
@@ -12,6 +12,7 @@
#include <memory>
+#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"
@@ -1083,11 +1084,16 @@
}
};
+std::unique_ptr<webrtc::TaskQueueFactory> CreateDefaultThreadFactory(
+ const webrtc::FieldTrialsView*) {
+ return std::make_unique<ThreadFactory>();
+}
+
using ::webrtc::TaskQueueTest;
INSTANTIATE_TEST_SUITE_P(RtcThread,
TaskQueueTest,
- ::testing::Values(std::make_unique<ThreadFactory>));
+ ::testing::Values(CreateDefaultThreadFactory));
} // namespace
} // namespace rtc
diff --git a/rtc_tools/video_replay.cc b/rtc_tools/video_replay.cc
index 7d331ad..1a7bfad 100644
--- a/rtc_tools/video_replay.cc
+++ b/rtc_tools/video_replay.cc
@@ -340,21 +340,22 @@
// 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<webrtc::TaskQueueFactory> 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> call;
- std::unique_ptr<StreamState> stream_state;
// Creation of the streams must happen inside a task queue because it is
// resued as a worker thread.
+ std::unique_ptr<Call> call;
+ std::unique_ptr<StreamState> 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 84c5f02..e2215c8 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<webrtc::FieldTrialBasedConfig>();
+ 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();