diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 12b8c05f3a..2bae52cf0f 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -479,6 +479,7 @@ rtc_source_set("rtc_task_queue") { deps = [ ":macromagic", "../api/task_queue", + "../api/task_queue:global_task_queue_factory", "system:rtc_export", "task_utils:to_queued_task", "//third_party/abseil-cpp/absl/memory", diff --git a/rtc_base/task_queue.cc b/rtc_base/task_queue.cc index 965a4d8c69..46ab495d48 100644 --- a/rtc_base/task_queue.cc +++ b/rtc_base/task_queue.cc @@ -9,6 +9,7 @@ */ #include "rtc_base/task_queue.h" +#include "api/task_queue/global_task_queue_factory.h" #include "api/task_queue/task_queue_base.h" namespace rtc { @@ -17,6 +18,10 @@ TaskQueue::TaskQueue( std::unique_ptr task_queue) : impl_(task_queue.release()) {} +TaskQueue::TaskQueue(const char* queue_name, Priority priority) + : TaskQueue(webrtc::GlobalTaskQueueFactory().CreateTaskQueue(queue_name, + priority)) {} + TaskQueue::~TaskQueue() { // There might running task that tries to rescheduler itself to the TaskQueue // and not yet aware TaskQueue destructor is called. diff --git a/rtc_base/task_queue.h b/rtc_base/task_queue.h index 01fcb78bd3..8d2a89ee21 100644 --- a/rtc_base/task_queue.h +++ b/rtc_base/task_queue.h @@ -80,6 +80,8 @@ class RTC_LOCKABLE RTC_EXPORT TaskQueue { explicit TaskQueue(std::unique_ptr task_queue); + explicit TaskQueue(const char* queue_name, + Priority priority = Priority::NORMAL); ~TaskQueue(); // Used for DCHECKing the current queue. diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn index 5f91caa864..bd2c931810 100644 --- a/test/fuzzers/BUILD.gn +++ b/test/fuzzers/BUILD.gn @@ -15,7 +15,9 @@ rtc_static_library("webrtc_fuzzer_main") { "webrtc_fuzzer_main.cc", ] deps = [ + "../../api/task_queue:global_task_queue_factory", "../../rtc_base:rtc_base_approved", + "../../rtc_base:rtc_task_queue_stdlib", "//testing/libfuzzer:libfuzzer_main", ] @@ -499,7 +501,6 @@ webrtc_fuzzer_test("audio_processing_fuzzer") { "../../modules/audio_processing/aec_dump:aec_dump_impl", "../../rtc_base:rtc_base_approved", "../../rtc_base:rtc_task_queue", - "../../rtc_base:rtc_task_queue_stdlib", "../../rtc_base:safe_minmax", "../../system_wrappers:field_trial", "//third_party/abseil-cpp/absl/memory", diff --git a/test/fuzzers/audio_processing_configs_fuzzer.cc b/test/fuzzers/audio_processing_configs_fuzzer.cc index 58d1e465bf..89c0552aab 100644 --- a/test/fuzzers/audio_processing_configs_fuzzer.cc +++ b/test/fuzzers/audio_processing_configs_fuzzer.cc @@ -18,7 +18,6 @@ #include "rtc_base/arraysize.h" #include "rtc_base/numerics/safe_minmax.h" #include "rtc_base/task_queue.h" -#include "rtc_base/task_queue_stdlib.h" #include "system_wrappers/include/field_trial.h" #include "test/fuzzers/audio_processing_fuzzer_helper.h" #include "test/fuzzers/fuzz_data_helper.h" @@ -149,19 +148,6 @@ std::unique_ptr CreateApm(test::FuzzDataHelper* fuzz_data, return apm; } - -TaskQueueFactory* GetTaskQueueFactory() { - // Chromium hijacked DefaultTaskQueueFactory with own implementation, but - // unable to use it without base::test::ScopedTaskEnvironment. Actual used - // task queue implementation shouldn't matter for the purpose of this fuzzer, - // so use stdlib implementation: that one is multiplatform. - // When bugs.webrtc.org/10284 is resolved and chromium stops hijacking - // DefaultTaskQueueFactory, Stdlib can be replaced with default one. - static TaskQueueFactory* const factory = - CreateTaskQueueStdlibFactory().release(); - return factory; -} - } // namespace void FuzzOneInput(const uint8_t* data, size_t size) { @@ -173,9 +159,9 @@ void FuzzOneInput(const uint8_t* data, size_t size) { // for field_trial.h. Hence it's created here and not in CreateApm. std::string field_trial_string = ""; - rtc::TaskQueue worker_queue(GetTaskQueueFactory()->CreateTaskQueue( - "rtc-low-prio", rtc::TaskQueue::Priority::LOW)); - auto apm = CreateApm(&fuzz_data, &field_trial_string, &worker_queue); + std::unique_ptr worker_queue( + new rtc::TaskQueue("rtc-low-prio", rtc::TaskQueue::Priority::LOW)); + auto apm = CreateApm(&fuzz_data, &field_trial_string, worker_queue.get()); if (apm) { FuzzAudioProcessing(&fuzz_data, std::move(apm)); diff --git a/test/fuzzers/webrtc_fuzzer_main.cc b/test/fuzzers/webrtc_fuzzer_main.cc index a52dd231be..3e05be632a 100644 --- a/test/fuzzers/webrtc_fuzzer_main.cc +++ b/test/fuzzers/webrtc_fuzzer_main.cc @@ -12,7 +12,9 @@ // It's intended to set sane defaults, such as removing logging for further // fuzzing efficiency. +#include "api/task_queue/global_task_queue_factory.h" #include "rtc_base/logging.h" +#include "rtc_base/task_queue_stdlib.h" namespace { bool g_initialized = false; @@ -26,6 +28,13 @@ void InitializeWebRtcFuzzDefaults() { rtc::LogMessage::LogToDebug(rtc::LS_NONE); #endif // !defined(WEBRTC_CHROMIUM_BUILD) + // Chromium hijacked DefaultTaskQueueFactory with own implementation, but + // unable to use it without base::test::ScopedTaskEnvironment. Actual used + // task queue implementation shouldn't matter for the purpose of the fuzzers, + // so use stdlib implementation: that one is multiplatform. This is a + // temporary solution until bugs.webrtc.org/10284 is resolved. + webrtc::SetGlobalTaskQueueFactory(webrtc::CreateTaskQueueStdlibFactory()); + g_initialized = true; } } // namespace