Skip to content

Commit 135ff42

Browse files
committed
Fix __receiver_proxy_base start_scheduler_t query.
* Return task_scheduler only when possible. * Return nullopt in other cases. * Terminate on exception. Add a regression test: parallel_scheduler used as the start scheduler in receiver_proxy's start_schedular_t query.
1 parent ea089e7 commit 135ff42

2 files changed

Lines changed: 14 additions & 6 deletions

File tree

include/stdexec/__detail/__task_scheduler.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -846,14 +846,15 @@ namespace STDEXEC
846846
{
847847
if (__value_type == __mtypeid<task_scheduler>)
848848
{
849-
auto& __val = *static_cast<std::optional<task_scheduler>*>(__dest);
850849
if constexpr (__callable<get_start_scheduler_t, env_of_t<_Rcvr>>)
851850
{
852-
__val.emplace(get_start_scheduler(get_env(__rcvr_)));
853-
}
854-
else
855-
{
856-
__val.emplace(inline_scheduler{});
851+
if constexpr (__std::constructible_from<
852+
task_scheduler,
853+
__call_result_t<get_start_scheduler_t, env_of_t<_Rcvr>>>)
854+
{
855+
auto& __val = *static_cast<std::optional<task_scheduler>*>(__dest);
856+
__val.emplace(get_start_scheduler(get_env(__rcvr_)));
857+
}
857858
}
858859
}
859860
}

test/stdexec/schedulers/test_parallel_scheduler.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ TEST_CASE("trivial schedule task on parallel scheduler", "[scheduler][parallel_s
9494
ex::sync_wait(ex::schedule(sched));
9595
}
9696

97+
TEST_CASE("can schedule from parallel scheduler to parallel scheduler",
98+
"[scheduler][parallel_scheduler]")
99+
{
100+
auto sched = ex::get_parallel_scheduler();
101+
ex::sync_wait(ex::starts_on(sched, ex::starts_on(sched, ex::just())));
102+
}
103+
97104
TEST_CASE("simple schedule task on parallel scheduler", "[scheduler][parallel_scheduler]")
98105
{
99106
std::thread::id this_id = std::this_thread::get_id();

0 commit comments

Comments
 (0)