# Copyright (c) 2018 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.

import("../../webrtc.gni")

rtc_source_set("task_queue") {
  visibility = [ "*" ]
  public = [
    "queued_task.h",
    "task_queue_priority.h",
  ]
}

# TODO(bugs.webrtc.org/10191): Merge the target into task_queue target above
# when support for link-time injection is dropped.
rtc_source_set("task_queue_factory") {
  visibility = [ "*" ]
  public = [
    "task_queue_base.h",
    "task_queue_factory.h",
  ]
  sources = [
    "task_queue_base.cc",
    "task_queue_impl.cc",
    "task_queue_impl.h",
  ]

  deps = [
    ":task_queue",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_task_queue_api",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/strings",
  ]
}

rtc_source_set("task_queue_test") {
  visibility = [ "*" ]
  testonly = true
  sources = [
    "task_queue_test.cc",
    "task_queue_test.h",
  ]
  deps = [
    ":task_queue",
    ":task_queue_factory",
    "../../rtc_base:rtc_event",
    "../../rtc_base:rtc_task_queue_api",
    "../../rtc_base:timeutils",
    "../../test:test_support",
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/strings",
  ]
}

rtc_source_set("default_task_queue_factory") {
  # TODO(bugs.webrtc.org/10191): Make public when implemented for all
  # supported platforms.
  visibility = [ ":global_task_queue_factory" ]
  sources = [
    "default_task_queue_factory.h",
  ]
  deps = [
    ":task_queue_factory",
  ]

  # TODO(bugs.webrtc.org/10284): Include implementation unconditionally when
  # global task queue factory is removed.
  if (rtc_link_task_queue_impl) {
    deps += [ ":default_task_queue_factory_impl" ]
  }
}

# TODO(bugs.webrtc.org/10191): Merge back to default_task_queue_factory when
# rtc_task_queue_impl build target is removed.
rtc_source_set("default_task_queue_factory_impl") {
  # Include the implementation when rtc_link_task_queue_impl is set to default
  # value of true or when explicit dependency on "rtc_task_queue_impl" is added.
  visibility = [
    ":default_task_queue_factory",
    "../../rtc_base:rtc_task_queue_impl",
  ]
  deps = [
    ":task_queue_factory",
  ]
  if (rtc_enable_libevent) {
    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" ]
  } else if (is_win && current_os != "winuwp") {
    sources = [
      "default_task_queue_factory_win.cc",
    ]
    deps += [ "../../rtc_base:rtc_task_queue_win" ]
  } else {
    sources = [
      "default_task_queue_factory_stdlib.cc",
    ]
    deps += [ "../../rtc_base:rtc_task_queue_stdlib" ]
  }
}

# Linking with global_task_queue_factory adds link-time implementation of the
# rtc::TaskQueue that allows run-time injection of the TaskQueue implementaion.
rtc_source_set("global_task_queue_factory") {
  # TODO(bugs.webrtc.org/10284): Remove this target when task queue factory
  # propagated to all components that create TaskQueues.
  visibility = [ "*" ]
  sources = [
    "global_task_queue_factory.cc",
    "global_task_queue_factory.h",

    # TODO(bugs.webrtc.org/10191): Move task_queue.cc to private build
    # "rtc_task_queue" when "rtc_task_queue_api", "rtc_task_queue",
    # and "rtc_task_queue_impl" can be joined.
    "task_queue.cc",
  ]
  deps = [
    ":default_task_queue_factory",
    ":task_queue_factory",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_task_queue_api",
  ]
}
