aboutsummaryrefslogtreecommitdiff
path: root/rtc_base
diff options
context:
space:
mode:
authorYura Yaroshevich <yura.yaroshevich@gmail.com>2020-03-16 18:00:59 +0300
committerCommit Bot <commit-bot@chromium.org>2020-03-18 16:06:09 +0000
commitebf739be7bab158806c6cec117c0ac5af209b0a7 (patch)
tree76d4083f97b134e00eabc1a72af3ab01a0ad2473 /rtc_base
parentfb862741984d9cf9341f7772c8a708b215ef35db (diff)
downloadwebrtc-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.gn1
-rw-r--r--rtc_base/system/BUILD.gn8
-rw-r--r--rtc_base/system/gcd_helpers.h29
-rw-r--r--rtc_base/system/gcd_helpers.m22
-rw-r--r--rtc_base/task_queue_gcd.cc9
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;