From ebf739be7bab158806c6cec117c0ac5af209b0a7 Mon Sep 17 00:00:00 2001 From: Yura Yaroshevich Date: Mon, 16 Mar 2020 18:00:59 +0300 Subject: [PATCH] Reland "Leverage dispatch_queue_create_with_target when possible." MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a reland of de86381161651816c078adeb354902b15d03a35b Original change's description: > Leverage dispatch_queue_create_with_target when possible. > > Replacing dispatch_queue_create followed by > dispatch_set_target_queue with dispatch_queue_create_with_target > is claimed to be source of GCD performance improvement: > https://developer.apple.com/videos/play/wwdc2017/706/ > Video since 40 min. Slides since 199. > > Bug: webrtc:9055 > Change-Id: I0136f7faaef0951a7ad243bc8772f3ee952d5470 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168491 > Reviewed-by: Tommi > Reviewed-by: Kári Helgason > Commit-Queue: Yura Yaroshevich > Cr-Commit-Position: refs/heads/master@{#30781} Bug: webrtc:9055 Change-Id: I36b0b6423c81c0497f66f7c993741c33ff6ec5ba Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/170443 Reviewed-by: Mirko Bonadei Reviewed-by: Tommi Reviewed-by: Kári Helgason Commit-Queue: Mirko Bonadei Cr-Commit-Position: refs/heads/master@{#30821} --- rtc_base/BUILD.gn | 1 + rtc_base/system/BUILD.gn | 8 +++++ rtc_base/system/gcd_helpers.h | 29 +++++++++++++++++++ rtc_base/system/gcd_helpers.m | 22 ++++++++++++++ rtc_base/task_queue_gcd.cc | 9 +++--- sdk/BUILD.gn | 1 + .../capturer/RTCCameraVideoCapturer.m | 9 +++--- .../capturer/RTCFileVideoCapturer.m | 8 +++-- 8 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 rtc_base/system/gcd_helpers.h create mode 100644 rtc_base/system/gcd_helpers.m diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 5cb3fea8da..2e4138e458 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -487,6 +487,7 @@ if (is_mac || is_ios) { ":checks", ":logging", "../api/task_queue", + "system:gcd_helpers", "//third_party/abseil-cpp/absl/strings", ] } diff --git a/rtc_base/system/BUILD.gn b/rtc_base/system/BUILD.gn index 937fec11e2..79cb301038 100644 --- a/rtc_base/system/BUILD.gn +++ b/rtc_base/system/BUILD.gn @@ -60,6 +60,14 @@ if (is_mac || is_ios) { deps = [ "..:checks" ] libs = [ "Foundation.framework" ] } + + rtc_library("gcd_helpers") { + sources = [ + "gcd_helpers.h", + "gcd_helpers.m", + ] + include_dirs = [ "../.." ] + } } rtc_source_set("thread_registry") { diff --git a/rtc_base/system/gcd_helpers.h b/rtc_base/system/gcd_helpers.h new file mode 100644 index 0000000000..a8df0a9d83 --- /dev/null +++ b/rtc_base/system/gcd_helpers.h @@ -0,0 +1,29 @@ +/* + * Copyright 2020 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. + */ + +#ifndef RTC_BASE_SYSTEM_GCD_HELPERS_H_ +#define RTC_BASE_SYSTEM_GCD_HELPERS_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT DISPATCH_NOTHROW dispatch_queue_t +RTCDispatchQueueCreateWithTarget(const char* label, + dispatch_queue_attr_t attr, + dispatch_queue_t target); + +#ifdef __cplusplus +} +#endif + +#endif // RTC_BASE_SYSTEM_GCD_HELPERS_H_ diff --git a/rtc_base/system/gcd_helpers.m b/rtc_base/system/gcd_helpers.m new file mode 100644 index 0000000000..ff113266a1 --- /dev/null +++ b/rtc_base/system/gcd_helpers.m @@ -0,0 +1,22 @@ +/* + * Copyright 2020 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 "rtc_base/system/gcd_helpers.h" + +dispatch_queue_t RTCDispatchQueueCreateWithTarget(const char *label, + dispatch_queue_attr_t attr, + dispatch_queue_t target) { + if (@available(iOS 10, macOS 10.12, tvOS 10, watchOS 3, *)) { + return dispatch_queue_create_with_target(label, attr, target); + } + dispatch_queue_t queue = dispatch_queue_create(label, attr); + dispatch_set_target_queue(queue, target); + return queue; +} \ No newline at end of file diff --git a/rtc_base/task_queue_gcd.cc b/rtc_base/task_queue_gcd.cc index cb516cc4cc..2276f635c5 100644 --- a/rtc_base/task_queue_gcd.cc +++ b/rtc_base/task_queue_gcd.cc @@ -24,6 +24,7 @@ #include "api/task_queue/task_queue_base.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" +#include "rtc_base/system/gcd_helpers.h" namespace webrtc { namespace { @@ -67,16 +68,16 @@ class TaskQueueGcd : public TaskQueueBase { }; TaskQueueGcd::TaskQueueGcd(absl::string_view queue_name, int gcd_priority) - : queue_(dispatch_queue_create(std::string(queue_name).c_str(), - DISPATCH_QUEUE_SERIAL)), + : queue_(RTCDispatchQueueCreateWithTarget( + std::string(queue_name).c_str(), + DISPATCH_QUEUE_SERIAL, + dispatch_get_global_queue(gcd_priority, 0))), is_active_(true) { RTC_CHECK(queue_); dispatch_set_context(queue_, this); // Assign a finalizer that will delete the queue when the last reference // is released. This may run after the TaskQueue::Delete. dispatch_set_finalizer_f(queue_, &DeleteQueue); - - dispatch_set_target_queue(queue_, dispatch_get_global_queue(gcd_priority, 0)); } TaskQueueGcd::~TaskQueueGcd() = default; diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 43ed6ae3be..1b313b3d87 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -573,6 +573,7 @@ if (is_ios || is_mac) { ":helpers_objc", ":video_objc", ":videoframebuffer_objc", + "../rtc_base/system:gcd_helpers", ] } diff --git a/sdk/objc/components/capturer/RTCCameraVideoCapturer.m b/sdk/objc/components/capturer/RTCCameraVideoCapturer.m index f83c03e4c0..5cfb616f5f 100644 --- a/sdk/objc/components/capturer/RTCCameraVideoCapturer.m +++ b/sdk/objc/components/capturer/RTCCameraVideoCapturer.m @@ -21,6 +21,7 @@ #import "helpers/AVCaptureSession+DevicePosition.h" #import "helpers/RTCDispatcher+Private.h" +#include "rtc_base/system/gcd_helpers.h" const int64_t kNanosecondsPerSecond = 1000000000; @@ -415,10 +416,10 @@ const int64_t kNanosecondsPerSecond = 1000000000; - (dispatch_queue_t)frameQueue { if (!_frameQueue) { - _frameQueue = - dispatch_queue_create("org.webrtc.cameravideocapturer.video", DISPATCH_QUEUE_SERIAL); - dispatch_set_target_queue(_frameQueue, - dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)); + _frameQueue = RTCDispatchQueueCreateWithTarget( + "org.webrtc.cameravideocapturer.video", + DISPATCH_QUEUE_SERIAL, + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)); } return _frameQueue; } diff --git a/sdk/objc/components/capturer/RTCFileVideoCapturer.m b/sdk/objc/components/capturer/RTCFileVideoCapturer.m index 207a21d8c0..2c82ba1ccf 100644 --- a/sdk/objc/components/capturer/RTCFileVideoCapturer.m +++ b/sdk/objc/components/capturer/RTCFileVideoCapturer.m @@ -13,6 +13,7 @@ #import "base/RTCLogging.h" #import "base/RTCVideoFrameBuffer.h" #import "components/video_frame_buffer/RTCCVPixelBuffer.h" +#include "rtc_base/system/gcd_helpers.h" NSString *const kRTCFileVideoCapturerErrorDomain = @"org.webrtc.RTCFileVideoCapturer"; @@ -118,9 +119,10 @@ typedef NS_ENUM(NSInteger, RTCFileVideoCapturerStatus) { - (dispatch_queue_t)frameQueue { if (!_frameQueue) { - _frameQueue = dispatch_queue_create("org.webrtc.filecapturer.video", DISPATCH_QUEUE_SERIAL); - dispatch_set_target_queue(_frameQueue, - dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); + _frameQueue = RTCDispatchQueueCreateWithTarget( + "org.webrtc.filecapturer.video", + DISPATCH_QUEUE_SERIAL, + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); } return _frameQueue; }