diff options
author | Yura Yaroshevich <yura.yaroshevich@gmail.com> | 2020-03-16 18:00:59 +0300 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-18 16:06:09 +0000 |
commit | ebf739be7bab158806c6cec117c0ac5af209b0a7 (patch) | |
tree | 76d4083f97b134e00eabc1a72af3ab01a0ad2473 /rtc_base | |
parent | fb862741984d9cf9341f7772c8a708b215ef35db (diff) | |
download | webrtc-ebf739be7bab158806c6cec117c0ac5af209b0a7.tar.gz |
Reland "Leverage dispatch_queue_create_with_target when possible."
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 <tommi@webrtc.org>
> Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
> Commit-Queue: Yura Yaroshevich <yura.yaroshevich@gmail.com>
> 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 <mbonadei@webrtc.org>
Reviewed-by: Tommi <tommi@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30821}
Diffstat (limited to 'rtc_base')
-rw-r--r-- | rtc_base/BUILD.gn | 1 | ||||
-rw-r--r-- | rtc_base/system/BUILD.gn | 8 | ||||
-rw-r--r-- | rtc_base/system/gcd_helpers.h | 29 | ||||
-rw-r--r-- | rtc_base/system/gcd_helpers.m | 22 | ||||
-rw-r--r-- | rtc_base/task_queue_gcd.cc | 9 |
5 files changed, 65 insertions, 4 deletions
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 <dispatch/dispatch.h> + +#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; |