From 35225a659618bb294fdd8585a0a31ca3e13a7875 Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Thu, 30 Apr 2026 20:18:22 -0500 Subject: [PATCH 01/10] Add parallel_scheduler scaffold --- .../execution/detail/parallel_scheduler.hpp | 61 +++++++++++++++++++ include/beman/execution/execution.hpp | 2 + src/beman/execution/CMakeLists.txt | 2 + src/beman/execution/execution-detail.cppm | 1 + src/beman/execution/execution.cppm | 5 ++ src/beman/execution/parallel_scheduler.cppm | 12 ++++ 6 files changed, 83 insertions(+) create mode 100644 include/beman/execution/detail/parallel_scheduler.hpp create mode 100644 src/beman/execution/parallel_scheduler.cppm diff --git a/include/beman/execution/detail/parallel_scheduler.hpp b/include/beman/execution/detail/parallel_scheduler.hpp new file mode 100644 index 00000000..0394734f --- /dev/null +++ b/include/beman/execution/detail/parallel_scheduler.hpp @@ -0,0 +1,61 @@ +// include/beman/execution/detail/parallel_scheduler.hpp -*-C++-*- +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef INCLUDED_BEMAN_EXECUTION_DETAIL_PARALLEL_SCHEDULER +#define INCLUDED_BEMAN_EXECUTION_DETAIL_PARALLEL_SCHEDULER + +#include +#ifdef BEMAN_HAS_IMPORT_STD +import std; +#else +#include +#include +#include +#include +#include +#include +#include +#include +#endif +#ifdef BEMAN_HAS_MODULES +import beman.execution.detail.completion_signatures; +import beman.execution.detail.get_completion_scheduler; +import beman.execution.detail.get_forward_progress_guarantee; +import beman.execution.detail.operation_state; +import beman.execution.detail.receiver; +import beman.execution.detail.scheduler; +import beman.execution.detail.scheduler_t; +import beman.execution.detail.sender; +import beman.execution.detail.set_error; +import beman.execution.detail.set_stopped; +import beman.execution.detail.set_value; +#else +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +// ---------------------------------------------------------------------------- + +namespace beman::execution { + +class parallel_scheduler { + // TODO(P2079R10): add scheduler state and operations. +}; + +// TODO(P2079R10): implement using system_context_replaceability::query_parallel_scheduler_backend(). +auto get_parallel_scheduler() -> parallel_scheduler; + +} // namespace beman::execution + +// ---------------------------------------------------------------------------- + +#endif // INCLUDED_BEMAN_EXECUTION_DETAIL_PARALLEL_SCHEDULER diff --git a/include/beman/execution/execution.hpp b/include/beman/execution/execution.hpp index 5f526386..914a5115 100644 --- a/include/beman/execution/execution.hpp +++ b/include/beman/execution/execution.hpp @@ -39,6 +39,7 @@ import beman.execution.detail.let; import beman.execution.detail.matching_sig; import beman.execution.detail.on; import beman.execution.detail.operation_state; +import beman.execution.detail.parallel_scheduler; import beman.execution.detail.prop; import beman.execution.detail.read_env; import beman.execution.detail.receiver; @@ -101,6 +102,7 @@ import beman.execution.detail.write_env; #include #include #include +#include #include #include #include diff --git a/src/beman/execution/CMakeLists.txt b/src/beman/execution/CMakeLists.txt index 674d52c5..e663edb8 100644 --- a/src/beman/execution/CMakeLists.txt +++ b/src/beman/execution/CMakeLists.txt @@ -133,6 +133,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/on_stop_request.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/operation_state.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/operation_state_task.hpp + ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/parallel_scheduler.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/product_type.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/prop.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/query_with_default.hpp @@ -327,6 +328,7 @@ if(BEMAN_USE_MODULES) on.cppm operation_state_task.cppm operation_state.cppm + parallel_scheduler.cppm product_type.cppm prop.cppm query_with_default.cppm diff --git a/src/beman/execution/execution-detail.cppm b/src/beman/execution/execution-detail.cppm index 568be1bb..6d8a0ad4 100644 --- a/src/beman/execution/execution-detail.cppm +++ b/src/beman/execution/execution-detail.cppm @@ -59,6 +59,7 @@ export import beman.execution.detail.non_assignable; export import beman.execution.detail.nothrow_callable; export import beman.execution.detail.notify; export import beman.execution.detail.operation_state_task; +export import beman.execution.detail.parallel_scheduler; export import beman.execution.detail.product_type; export import beman.execution.detail.query_with_default; export import beman.execution.detail.queryable; diff --git a/src/beman/execution/execution.cppm b/src/beman/execution/execution.cppm index 3de60d3c..c6e4b9d4 100644 --- a/src/beman/execution/execution.cppm +++ b/src/beman/execution/execution.cppm @@ -43,6 +43,7 @@ import beman.execution.detail.never_stop_token; import beman.execution.detail.nostopstate; import beman.execution.detail.on; export import beman.execution.detail.operation_state; // [exec.opstate], operation states +import beman.execution.detail.parallel_scheduler; import beman.execution.detail.prop; import beman.execution.detail.read_env; import beman.execution.detail.run_loop; @@ -237,6 +238,10 @@ export using ::beman::execution::stopped_as_error; // [exec.run.loop], run_loop export using ::beman::execution::run_loop; +// [exec.parallel.scheduler], parallel scheduler +export using ::beman::execution::parallel_scheduler; +export using ::beman::execution::get_parallel_scheduler; + // [exec.consumers], consumers export using ::beman::execution::sync_wait_t; export using ::beman::execution::sync_wait_with_variant_t; diff --git a/src/beman/execution/parallel_scheduler.cppm b/src/beman/execution/parallel_scheduler.cppm new file mode 100644 index 00000000..14076f84 --- /dev/null +++ b/src/beman/execution/parallel_scheduler.cppm @@ -0,0 +1,12 @@ +module; +// src/beman/execution/parallel_scheduler.cppm -*-C++-*- +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include + +export module beman.execution.detail.parallel_scheduler; + +namespace beman::execution { +export using beman::execution::parallel_scheduler; +export using beman::execution::get_parallel_scheduler; +} // namespace beman::execution From 799718972a3d8aa26214cd5e6d238f0a664166ee Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 19:15:10 -0500 Subject: [PATCH 02/10] added receiver proxy --- .../execution/detail/parallel_scheduler.hpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/beman/execution/detail/parallel_scheduler.hpp b/include/beman/execution/detail/parallel_scheduler.hpp index 0394734f..d30b226f 100644 --- a/include/beman/execution/detail/parallel_scheduler.hpp +++ b/include/beman/execution/detail/parallel_scheduler.hpp @@ -45,6 +45,24 @@ import beman.execution.detail.set_value; // ---------------------------------------------------------------------------- +namespace beman::execution::system_context_replaceability { + +struct receiver_proxy { + virtual ~receiver_proxy() = default; + + virtual auto set_value() noexcept -> void = 0; + virtual auto set_error(::std::exception_ptr) noexcept -> void = 0; + virtual auto set_stopped() noexcept -> void = 0; + + template + requires(::std::same_as> && ::std::is_object_v

&& !::std::is_array_v

) + auto try_query(Query) noexcept -> ::std::optional

{ + // TODO(P2079R10): forward supported receiver environment queries + // through this proxy, especially get_stop_token_t -> inplace_stop_token + return ::std::nullopt; + } +}; + namespace beman::execution { class parallel_scheduler { From fb72e92b3dd8dfe5672e9f59f6d284d3c4c25a36 Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 19:44:41 -0500 Subject: [PATCH 03/10] Add receiver_proxy module export --- src/beman/execution/parallel_scheduler.cppm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/beman/execution/parallel_scheduler.cppm b/src/beman/execution/parallel_scheduler.cppm index 14076f84..234cecbf 100644 --- a/src/beman/execution/parallel_scheduler.cppm +++ b/src/beman/execution/parallel_scheduler.cppm @@ -9,4 +9,8 @@ export module beman.execution.detail.parallel_scheduler; namespace beman::execution { export using beman::execution::parallel_scheduler; export using beman::execution::get_parallel_scheduler; + +namespace system_context_replaceability { +export using beman::execution::system_context_replaceability::query_parallel_scheduler_backend; +} // namespace system_context_replaceability } // namespace beman::execution From a38059efd834d3d7cf32d44ee9f52313a618b603 Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 19:46:45 -0500 Subject: [PATCH 04/10] added correct import --- src/beman/execution/parallel_scheduler.cppm | 1 + 1 file changed, 1 insertion(+) diff --git a/src/beman/execution/parallel_scheduler.cppm b/src/beman/execution/parallel_scheduler.cppm index 234cecbf..760cdc45 100644 --- a/src/beman/execution/parallel_scheduler.cppm +++ b/src/beman/execution/parallel_scheduler.cppm @@ -11,6 +11,7 @@ export using beman::execution::parallel_scheduler; export using beman::execution::get_parallel_scheduler; namespace system_context_replaceability { +export using beman::execution::system_context_replaceability::receiver_proxy; export using beman::execution::system_context_replaceability::query_parallel_scheduler_backend; } // namespace system_context_replaceability } // namespace beman::execution From 14fd292b4531f51a12b7741f22c6bf919269ae25 Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 19:47:38 -0500 Subject: [PATCH 05/10] added correct import --- src/beman/execution/parallel_scheduler.cppm | 1 - 1 file changed, 1 deletion(-) diff --git a/src/beman/execution/parallel_scheduler.cppm b/src/beman/execution/parallel_scheduler.cppm index 760cdc45..ee434f01 100644 --- a/src/beman/execution/parallel_scheduler.cppm +++ b/src/beman/execution/parallel_scheduler.cppm @@ -12,6 +12,5 @@ export using beman::execution::get_parallel_scheduler; namespace system_context_replaceability { export using beman::execution::system_context_replaceability::receiver_proxy; -export using beman::execution::system_context_replaceability::query_parallel_scheduler_backend; } // namespace system_context_replaceability } // namespace beman::execution From ffda8baf9589585365f1fb79c7e4da590a31ce33 Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 19:56:40 -0500 Subject: [PATCH 06/10] fixed syntax for system_context_replaceability --- include/beman/execution/detail/parallel_scheduler.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/beman/execution/detail/parallel_scheduler.hpp b/include/beman/execution/detail/parallel_scheduler.hpp index d30b226f..1e22109b 100644 --- a/include/beman/execution/detail/parallel_scheduler.hpp +++ b/include/beman/execution/detail/parallel_scheduler.hpp @@ -62,6 +62,7 @@ struct receiver_proxy { return ::std::nullopt; } }; +}// namespace beman::execution::system_context_replaceability namespace beman::execution { From 9c686efe61be1c60ace7123f31b057e4c5847bb7 Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 20:18:11 -0500 Subject: [PATCH 07/10] added bulk_item_receiver_proxy --- include/beman/execution/detail/parallel_scheduler.hpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/include/beman/execution/detail/parallel_scheduler.hpp b/include/beman/execution/detail/parallel_scheduler.hpp index 1e22109b..ce5ab8e9 100644 --- a/include/beman/execution/detail/parallel_scheduler.hpp +++ b/include/beman/execution/detail/parallel_scheduler.hpp @@ -50,9 +50,9 @@ namespace beman::execution::system_context_replaceability { struct receiver_proxy { virtual ~receiver_proxy() = default; - virtual auto set_value() noexcept -> void = 0; + virtual auto set_value() noexcept -> void = 0; virtual auto set_error(::std::exception_ptr) noexcept -> void = 0; - virtual auto set_stopped() noexcept -> void = 0; + virtual auto set_stopped() noexcept -> void = 0; template requires(::std::same_as> && ::std::is_object_v

&& !::std::is_array_v

) @@ -62,7 +62,12 @@ struct receiver_proxy { return ::std::nullopt; } }; -}// namespace beman::execution::system_context_replaceability + +struct bulk_item_receiver_proxy : receiver_proxy { + virtual auto execute(::std::size_t, ::std::size_t) noexcept -> void = 0; +}; + +} // namespace beman::execution::system_context_replaceability namespace beman::execution { From 089d2a7b88ca939cbd8cde4949bb7b5be809e0a9 Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 21:34:02 -0500 Subject: [PATCH 08/10] added parallel_scheduler_backend --- .../beman/execution/detail/parallel_scheduler.hpp | 15 +++++++++++++++ src/beman/execution/parallel_scheduler.cppm | 1 + 2 files changed, 16 insertions(+) diff --git a/include/beman/execution/detail/parallel_scheduler.hpp b/include/beman/execution/detail/parallel_scheduler.hpp index ce5ab8e9..092f49bb 100644 --- a/include/beman/execution/detail/parallel_scheduler.hpp +++ b/include/beman/execution/detail/parallel_scheduler.hpp @@ -67,6 +67,21 @@ struct bulk_item_receiver_proxy : receiver_proxy { virtual auto execute(::std::size_t, ::std::size_t) noexcept -> void = 0; }; +struct parallel_scheduler_backend { + virtual ~parallel_scheduler_backend() = default; + + virtual auto schedule(receiver_proxy&, ::std::span<::std::byte>) noexcept -> void = 0; + virtual auto schedule_bulk_chunked(::std::size_t, + bulk_item_receiver_proxy&, + ::std::span<::std::byte>) noexcept -> void = 0; + virtual auto schedule_bulk_unchunked(::std::size_t, + bulk_item_receiver_proxy&, + ::std::span<::std::byte>) noexcept -> void = 0; +}; + +// TODO(P2079R10): provide the project-supported link-time replaceability hook. +auto query_parallel_scheduler_backend() -> ::std::shared_ptr; + } // namespace beman::execution::system_context_replaceability namespace beman::execution { diff --git a/src/beman/execution/parallel_scheduler.cppm b/src/beman/execution/parallel_scheduler.cppm index ee434f01..760cdc45 100644 --- a/src/beman/execution/parallel_scheduler.cppm +++ b/src/beman/execution/parallel_scheduler.cppm @@ -12,5 +12,6 @@ export using beman::execution::get_parallel_scheduler; namespace system_context_replaceability { export using beman::execution::system_context_replaceability::receiver_proxy; +export using beman::execution::system_context_replaceability::query_parallel_scheduler_backend; } // namespace system_context_replaceability } // namespace beman::execution From 9cf288ff2505d0f5adce777e6961429450e79ba8 Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 22:13:36 -0500 Subject: [PATCH 09/10] added parallel_scheduler --- .../execution/detail/parallel_scheduler.hpp | 34 ++++++++++++++++++- src/beman/execution/parallel_scheduler.cppm | 2 ++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/beman/execution/detail/parallel_scheduler.hpp b/include/beman/execution/detail/parallel_scheduler.hpp index 092f49bb..38a7ed62 100644 --- a/include/beman/execution/detail/parallel_scheduler.hpp +++ b/include/beman/execution/detail/parallel_scheduler.hpp @@ -87,7 +87,39 @@ auto query_parallel_scheduler_backend() -> ::std::shared_ptr parallel_scheduler& = default; + auto operator=(parallel_scheduler&&) noexcept -> parallel_scheduler& = default; + + auto operator==(const parallel_scheduler& other) const noexcept -> bool { + return this->backend_ == other.backend_; + } + + static constexpr auto query(::beman::execution::get_forward_progress_guarantee_t) noexcept + -> ::beman::execution::forward_progress_guarantee { + return ::beman::execution::forward_progress_guarantee::parallel; + } + + auto schedule() const noexcept -> sender; + // TODO(P2079R10): customize bulk_chunked and bulk_unchunked for this scheduler. + + private: + explicit parallel_scheduler(::std::shared_ptr backend) noexcept : backend_(::std::move(backend)) {} + + ::std::shared_ptr backend_; + + friend auto get_parallel_scheduler() -> parallel_scheduler; }; // TODO(P2079R10): implement using system_context_replaceability::query_parallel_scheduler_backend(). diff --git a/src/beman/execution/parallel_scheduler.cppm b/src/beman/execution/parallel_scheduler.cppm index 760cdc45..16138923 100644 --- a/src/beman/execution/parallel_scheduler.cppm +++ b/src/beman/execution/parallel_scheduler.cppm @@ -12,6 +12,8 @@ export using beman::execution::get_parallel_scheduler; namespace system_context_replaceability { export using beman::execution::system_context_replaceability::receiver_proxy; +export using beman::execution::system_context_replaceability::bulk_item_receiver_proxy; +export using beman::execution::system_context_replaceability::parallel_scheduler_backend; export using beman::execution::system_context_replaceability::query_parallel_scheduler_backend; } // namespace system_context_replaceability } // namespace beman::execution From eb7709afefbcb728fc01b8e282126e6a4c43b0fd Mon Sep 17 00:00:00 2001 From: JorgeV92 Date: Sun, 3 May 2026 22:41:39 -0500 Subject: [PATCH 10/10] fixed format --- .../beman/execution/detail/parallel_scheduler.hpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/include/beman/execution/detail/parallel_scheduler.hpp b/include/beman/execution/detail/parallel_scheduler.hpp index 38a7ed62..923702b2 100644 --- a/include/beman/execution/detail/parallel_scheduler.hpp +++ b/include/beman/execution/detail/parallel_scheduler.hpp @@ -71,12 +71,10 @@ struct parallel_scheduler_backend { virtual ~parallel_scheduler_backend() = default; virtual auto schedule(receiver_proxy&, ::std::span<::std::byte>) noexcept -> void = 0; - virtual auto schedule_bulk_chunked(::std::size_t, - bulk_item_receiver_proxy&, - ::std::span<::std::byte>) noexcept -> void = 0; - virtual auto schedule_bulk_unchunked(::std::size_t, - bulk_item_receiver_proxy&, - ::std::span<::std::byte>) noexcept -> void = 0; + virtual auto schedule_bulk_chunked(::std::size_t, bulk_item_receiver_proxy&, ::std::span<::std::byte>) noexcept + -> void = 0; + virtual auto schedule_bulk_unchunked(::std::size_t, bulk_item_receiver_proxy&, ::std::span<::std::byte>) noexcept + -> void = 0; }; // TODO(P2079R10): provide the project-supported link-time replaceability hook. @@ -94,7 +92,7 @@ class parallel_scheduler { class sender; - parallel_scheduler() = delete; + parallel_scheduler() = delete; ~parallel_scheduler() = default; parallel_scheduler(const parallel_scheduler&) noexcept = default;