blob: 57b5b14c55004143b59e7dea5af7b33b311b729e [file]
# Copyright 2025 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_python//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
load(
"//pw_build:compatibility.bzl",
"incompatible_with_mcu",
"minimum_cxx_20",
)
load("//pw_build:pw_facade.bzl", "pw_facade")
load("//pw_unit_test:pw_cc_test.bzl", "pw_cc_test")
package(
default_visibility = ["//visibility:public"],
)
licenses(["notice"])
cc_library(
name = "poll",
hdrs = [
"public/pw_async2/internal/poll_internal.h",
"public/pw_async2/poll.h",
"public/pw_async2/try.h",
],
strip_include_prefix = "public",
deps = [
"//pw_polyfill",
"//pw_string:to_string",
"//third_party/fuchsia:stdcompat",
],
)
pw_cc_test(
name = "poll_test",
srcs = ["poll_test.cc"],
deps = [
":poll",
"//pw_result",
],
)
pw_facade(
name = "dispatcher",
srcs = [
"context.cc",
"dispatcher_base.cc",
"task.cc",
"waker.cc",
],
hdrs = [
"public/pw_async2/context.h",
"public/pw_async2/dispatcher.h",
"public/pw_async2/dispatcher_base.h",
"public/pw_async2/future.h",
"public/pw_async2/internal/config.h",
"public/pw_async2/lock.h",
"public/pw_async2/owned_task.h",
"public/pw_async2/task.h",
"public/pw_async2/waker.h",
],
backend = ":dispatcher_backend",
# LINT.IfChange
defines = select({
":debug_wait_reason_disabled": ["PW_ASYNC2_DEBUG_WAIT_REASON=0"],
":debug_wait_reason_enabled": ["PW_ASYNC2_DEBUG_WAIT_REASON=1"],
}),
# LINT.ThenChange(//pw_async2/public/pw_async2/internal/config.h)
implementation_deps = [
"//pw_assert:check",
"//pw_thread:sleep",
],
strip_include_prefix = "public",
deps = [
":config_override",
":poll",
"//pw_assert:assert",
"//pw_chrono:system_clock",
"//pw_containers:intrusive_forward_list",
"//pw_containers:intrusive_list",
"//pw_log",
"//pw_log:args",
"//pw_metric:metric",
"//pw_sync:interrupt_spin_lock",
"//pw_sync:lock_annotations",
"//pw_tokenizer",
"//pw_toolchain:no_destructor",
],
)
label_flag(
name = "dispatcher_backend",
build_setting_default = ":dispatcher_backend_multiplexer",
)
label_flag(
name = "config_override",
build_setting_default = "//pw_build:default_module_config",
)
constraint_setting(
name = "debug_wait_reason",
default_constraint_value = "debug_wait_reason_enabled",
)
constraint_value(
name = "debug_wait_reason_disabled",
constraint_setting = ":debug_wait_reason",
)
constraint_value(
name = "debug_wait_reason_enabled",
constraint_setting = ":debug_wait_reason",
)
cc_library(
name = "dispatcher_backend_multiplexer",
visibility = ["//targets:__pkg__"],
deps = select({
"@platforms//os:linux": ["//pw_async2_epoll:dispatcher"],
"//conditions:default": ["//pw_async2_basic:dispatcher"],
}),
)
pw_cc_test(
name = "dispatcher_test",
srcs = ["dispatcher_test.cc"],
deps = [
":dispatcher",
"//pw_containers:vector",
],
)
pw_cc_test(
name = "dispatcher_thread_test",
srcs = ["dispatcher_thread_test.cc"],
# TODO: b/343776738 - update to run on all compatible devices
target_compatible_with = incompatible_with_mcu(),
deps = [
":dispatcher",
"//pw_function",
"//pw_thread:sleep",
"//pw_thread:thread",
"//pw_thread_stl:options",
],
)
pw_cc_test(
name = "task_test",
srcs = ["task_test.cc"],
deps = [
":dispatcher",
"//pw_sync:binary_semaphore",
"//pw_thread:sleep",
"//pw_thread:test_thread_context",
"//pw_thread:thread",
],
)
cc_library(
name = "pendable",
hdrs = [
"public/pw_async2/pendable.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
":poll",
],
)
pw_cc_test(
name = "pendable_test",
srcs = ["pendable_test.cc"],
deps = [
":dispatcher",
":pendable",
":poll",
],
)
pw_cc_test(
name = "future_test",
srcs = ["future_test.cc"],
has_nc_test = True,
deps = [
":dispatcher",
":pend_func_task",
":poll",
":select",
],
)
cc_library(
name = "value_future",
hdrs = [
"public/pw_async2/value_future.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
":poll",
],
)
pw_cc_test(
name = "value_future_test",
srcs = ["value_future_test.cc"],
deps = [
":dispatcher",
":pend_func_task",
":poll",
":value_future",
],
)
cc_library(
name = "pend_func_awaitable",
hdrs = [
"public/pw_async2/pend_func_awaitable.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
":poll",
"//pw_function",
],
)
pw_cc_test(
name = "pend_func_awaitable_test",
srcs = ["pend_func_awaitable_test.cc"],
deps = [
":coro",
":coro_or_else_task",
":dispatcher",
":pend_func_awaitable",
":poll",
"//pw_allocator:testing",
"//pw_function",
"//pw_status",
],
)
cc_library(
name = "pend_func_task",
hdrs = [
"public/pw_async2/pend_func_task.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
"//pw_function",
],
)
pw_cc_test(
name = "pend_func_task_test",
srcs = ["pend_func_task_test.cc"],
deps = [
":dispatcher",
":pend_func_task",
"//pw_function",
],
)
cc_library(
name = "callback_task",
hdrs = [
"public/pw_async2/callback_task.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
"//pw_function",
],
)
pw_cc_test(
name = "callback_task_test",
srcs = ["callback_task_test.cc"],
deps = [
":callback_task",
":dispatcher",
"//pw_function",
],
)
cc_library(
name = "pendable_as_task",
hdrs = [
"public/pw_async2/pendable_as_task.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
],
)
pw_cc_test(
name = "pendable_as_task_test",
srcs = ["pendable_as_task_test.cc"],
deps = [
":dispatcher",
":pendable_as_task",
],
)
cc_library(
name = "allocate_task",
hdrs = [
"public/pw_async2/allocate_task.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
"//pw_allocator:allocator",
],
)
pw_cc_test(
name = "allocate_task_test",
srcs = ["allocate_task_test.cc"],
deps = [
":allocate_task",
"//pw_allocator:testing",
],
)
cc_library(
name = "once_sender",
hdrs = [
"public/pw_async2/once_sender.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
"//pw_function",
"//pw_sync:mutex",
],
)
pw_cc_test(
name = "once_sender_test",
srcs = [
"once_sender_test.cc",
],
deps = [
":dispatcher",
":once_sender",
"//pw_containers:vector",
],
)
cc_library(
name = "waker_queue",
srcs = [
"waker_queue.cc",
],
hdrs = [
"public/pw_async2/waker_queue.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
"//pw_containers:inline_queue",
"//pw_log:args",
],
)
pw_cc_test(
name = "waker_queue_test",
srcs = [
"waker_queue_test.cc",
],
deps = [
":dispatcher",
":pend_func_task",
":waker_queue",
],
)
cc_library(
name = "coro",
srcs = [
"coro.cc",
],
hdrs = [
"public/pw_async2/coro.h",
],
implementation_deps = [
"//pw_log",
],
strip_include_prefix = "public",
target_compatible_with = minimum_cxx_20(),
deps = [
":dispatcher",
"//pw_allocator:allocator",
"//pw_function",
"//pw_status",
],
)
pw_cc_test(
name = "coro_test",
srcs = ["coro_test.cc"],
deps = [
":coro",
":dispatcher",
"//pw_allocator:null_allocator",
"//pw_allocator:testing",
"//pw_status",
],
)
cc_library(
name = "coro_or_else_task",
hdrs = [
"public/pw_async2/coro_or_else_task.h",
],
strip_include_prefix = "public",
deps = [
":coro",
":dispatcher",
"//pw_function",
"//pw_status",
],
)
pw_cc_test(
name = "coro_or_else_task_test",
srcs = ["coro_or_else_task_test.cc"],
deps = [
":coro",
":coro_or_else_task",
":dispatcher",
"//pw_allocator:null_allocator",
"//pw_allocator:testing",
"//pw_status",
],
)
cc_library(
name = "time_provider",
srcs = [
"time_provider.cc",
],
hdrs = [
"public/pw_async2/time_provider.h",
],
implementation_deps = ["//pw_assert:check"],
strip_include_prefix = "public",
deps = [
":dispatcher",
"//pw_chrono:virtual_clock",
"//pw_containers:intrusive_list",
"//pw_sync:interrupt_spin_lock",
"//pw_sync:lock_annotations",
"//pw_toolchain:no_destructor",
],
)
cc_library(
name = "system_time_provider",
srcs = [
"system_time_provider.cc",
],
hdrs = [
"public/pw_async2/system_time_provider.h",
],
implementation_deps = [
"//pw_chrono:system_timer",
"//pw_toolchain:no_destructor",
],
strip_include_prefix = "public",
deps = [
":time_provider",
"//pw_chrono:system_clock",
],
)
pw_cc_test(
name = "system_time_provider_test",
srcs = [
"system_time_provider_test.cc",
],
deps = [":system_time_provider"],
)
cc_library(
name = "simulated_time_provider",
hdrs = [
"public/pw_async2/simulated_time_provider.h",
],
strip_include_prefix = "public",
deps = [
":time_provider",
"//pw_sync:interrupt_spin_lock",
],
)
pw_cc_test(
name = "simulated_time_provider_test",
srcs = [
"simulated_time_provider_test.cc",
],
deps = [
":simulated_time_provider",
"//pw_chrono:system_clock",
],
)
cc_library(
name = "cancellable_task",
hdrs = [
"public/pw_async2/cancellable_task.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
],
)
pw_cc_test(
name = "cancellable_task_test",
srcs = [
"cancellable_task_test.cc",
],
deps = [
":cancellable_task",
":dispatcher",
":pendable",
":poll",
"//pw_function",
],
)
cc_library(
name = "enqueue_heap_func",
hdrs = [
"public/pw_async2/enqueue_heap_func.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
],
)
pw_cc_test(
name = "enqueue_heap_func_test",
srcs = [
"enqueue_heap_func_test.cc",
],
deps = [
":dispatcher",
":enqueue_heap_func",
],
)
cc_library(
name = "join",
hdrs = [
"public/pw_async2/join.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
],
)
pw_cc_test(
name = "join_test",
srcs = [
"join_test.cc",
],
has_nc_test = True,
deps = [
":dispatcher",
":join",
":value_future",
],
)
cc_library(
name = "select",
hdrs = [
"public/pw_async2/select.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
"//pw_containers:optional_tuple",
],
)
pw_cc_test(
name = "select_test",
srcs = [
"select_test.cc",
],
deps = [
":dispatcher",
":pendable",
":poll",
":select",
":value_future",
],
)
cc_library(
name = "channel",
hdrs = [
"public/pw_async2/channel.h",
],
strip_include_prefix = "public",
deps = [
":dispatcher",
":poll",
"//pw_allocator",
"//pw_containers:deque",
"//pw_numeric:checked_arithmetic",
"//pw_sync:interrupt_spin_lock",
],
)
pw_cc_test(
name = "channel_test",
srcs = [
"channel_test.cc",
],
deps = [
":channel",
":dispatcher",
":pend_func_task",
":poll",
"//pw_allocator:testing",
"//pw_containers:vector",
],
)
pw_cc_test(
name = "channel_coro_test",
srcs = [
"channel_coro_test.cc",
],
deps = [
":channel",
":coro",
":coro_or_else_task",
":dispatcher",
":poll",
"//pw_allocator:testing",
"//pw_containers:vector",
],
)
sphinx_docs_library(
name = "docs",
srcs = [
"backends.rst",
"code_size.rst",
"coroutines.rst",
"docs.rst",
"futures.rst",
"guides.rst",
"informed_poll.rst",
"public/pw_async2/coro.h",
"quickstart.rst",
"//pw_async2/codelab:docs",
"//pw_async2/examples:channel.cc",
"//pw_async2/examples:custom_future.cc",
"//pw_async2/examples:docs",
"//pw_async2/size_report:full_size_report",
"//pw_async2/size_report:once_sender_size_report",
"//pw_async2/size_report:utilities_size_report",
],
prefix = "pw_async2/",
target_compatible_with = incompatible_with_mcu(),
)
filegroup(
name = "doxygen",
srcs = [
"public/pw_async2/allocate_task.h",
"public/pw_async2/callback_task.h",
"public/pw_async2/cancellable_task.h",
"public/pw_async2/channel.h",
"public/pw_async2/context.h",
"public/pw_async2/coro.h",
"public/pw_async2/coro_or_else_task.h",
"public/pw_async2/dispatcher.h",
"public/pw_async2/dispatcher_base.h",
"public/pw_async2/enqueue_heap_func.h",
"public/pw_async2/future.h",
"public/pw_async2/internal/config.h",
"public/pw_async2/join.h",
"public/pw_async2/lock.h",
"public/pw_async2/once_sender.h",
"public/pw_async2/owned_task.h",
"public/pw_async2/pend_func_awaitable.h",
"public/pw_async2/pend_func_task.h",
"public/pw_async2/pendable.h",
"public/pw_async2/pendable_as_task.h",
"public/pw_async2/poll.h",
"public/pw_async2/select.h",
"public/pw_async2/simulated_time_provider.h",
"public/pw_async2/system_time_provider.h",
"public/pw_async2/task.h",
"public/pw_async2/time_provider.h",
"public/pw_async2/try.h",
"public/pw_async2/waker.h",
"public/pw_async2/waker_queue.h",
],
)