Skip to content

Commit 423cfae

Browse files
authored
Merge pull request #1603 from ericniebler/promote-inline-scheduler
promote `inline_scheduler` to the `stdexec` namespace per P3552
2 parents 31c13f5 + f4ad47a commit 423cfae

15 files changed

Lines changed: 69 additions & 60 deletions

examples/nvexec/maxwell_cpu_st.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ auto main(int argc, char *argv[]) -> int {
5353
report_header();
5454

5555
if (value(params, "run-inline-scheduler")) {
56-
run_snr_on("CPU (snr inline)", exec::inline_scheduler{});
56+
run_snr_on("CPU (snr inline)", stdexec::inline_scheduler{});
5757
}
5858

5959
if (value(params, "run-cpp")) {

include/exec/async_scope.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,7 @@ namespace exec {
691691
}
692692

693693
[[nodiscard]]
694-
auto query(get_scheduler_t) const noexcept -> __inln::__scheduler {
694+
auto query(get_scheduler_t) const noexcept -> stdexec::inline_scheduler {
695695
return {};
696696
}
697697
};

include/exec/at_coroutine_exit.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ namespace exec {
237237

238238
bool __is_unhandled_stopped_{false};
239239
std::tuple<_Ts&...> __args_{};
240-
__any_scheduler __scheduler_{inline_scheduler{}};
240+
__any_scheduler __scheduler_{stdexec::inline_scheduler{}};
241241
};
242242

243243
__coro::coroutine_handle<__promise> __coro_;

include/exec/inline_scheduler.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@
2020
namespace exec {
2121
// A simple scheduler that executes its continuation inline, on the
2222
// thread of the caller of start().
23-
using inline_scheduler = stdexec::__inln::__scheduler;
23+
using inline_scheduler [[deprecated("Use stdexec::inline_scheduler instead")]] = stdexec::inline_scheduler;
2424
} // namespace exec

include/exec/on_coro_disposition.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ namespace exec {
183183
using __get_disposition_callback_t = task_disposition (*)(void*) noexcept;
184184
__coro::coroutine_handle<> __parent_{};
185185
__get_disposition_callback_t __get_disposition_callback_{nullptr};
186-
__any_scheduler __scheduler_{inline_scheduler{}};
186+
__any_scheduler __scheduler_{stdexec::inline_scheduler{}};
187187
};
188188

189189
__coro::coroutine_handle<__promise> __coro_;

include/exec/task.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
#include "any_sender_of.hpp"
2929
#include "at_coroutine_exit.hpp"
30-
#include "inline_scheduler.hpp"
3130
#include "scope.hpp"
3231

3332
STDEXEC_PRAGMA_PUSH()
@@ -96,7 +95,7 @@ namespace exec {
9695
static constexpr bool __with_scheduler = _SchedulerAffinity == __scheduler_affinity::__sticky;
9796

9897
STDEXEC_ATTRIBUTE(no_unique_address)
99-
__if_c<__with_scheduler, __any_scheduler, __ignore> __scheduler_{exec::inline_scheduler{}};
98+
__if_c<__with_scheduler, __any_scheduler, __ignore> __scheduler_{stdexec::inline_scheduler{}};
10099
inplace_stop_token __stop_token_;
101100

102101
public:
@@ -336,7 +335,7 @@ namespace exec {
336335
}
337336

338337
private:
339-
using __scheduler_t = __query_result_or_t<get_scheduler_t, _Context, inline_scheduler>;
338+
using __scheduler_t = __query_result_or_t<get_scheduler_t, _Context, stdexec::inline_scheduler>;
340339

341340
struct __final_awaitable {
342341
static constexpr auto await_ready() noexcept -> bool {

include/stdexec/__detail/__inline_scheduler.hpp

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,63 +17,73 @@
1717

1818
#include "__execution_fwd.hpp"
1919

20-
#include "__basic_sender.hpp"
21-
#include "__cpo.hpp"
2220
#include "__env.hpp"
2321
#include "__receivers.hpp"
2422
#include "__schedulers.hpp"
25-
#include "__utility.hpp"
2623

2724
namespace stdexec {
28-
namespace __inln {
29-
struct __schedule_t { };
25+
struct inline_scheduler {
26+
private:
27+
template <class _Receiver>
28+
struct __opstate {
29+
using __id = __opstate;
30+
using __t = __opstate;
3031

31-
struct __scheduler {
32-
using __t = __scheduler;
33-
using __id = __scheduler;
32+
using operation_state_concept = operation_state_t;
3433

35-
template <class _Tag = __schedule_t>
36-
STDEXEC_ATTRIBUTE(nodiscard, host, device)
37-
auto schedule() const noexcept {
38-
return __make_sexpr<_Tag>();
39-
}
40-
41-
[[nodiscard]]
42-
auto query(get_forward_progress_guarantee_t) const noexcept -> forward_progress_guarantee {
43-
return forward_progress_guarantee::weakly_parallel;
34+
STDEXEC_ATTRIBUTE(host, device)
35+
constexpr void start() noexcept {
36+
stdexec::set_value(static_cast<_Receiver&&>(__rcvr_));
4437
}
4538

46-
auto operator==(const __scheduler&) const noexcept -> bool = default;
39+
_Receiver __rcvr_;
4740
};
4841

49-
struct __env {
42+
struct __attrs {
43+
STDEXEC_ATTRIBUTE(nodiscard, host, device)
5044
static constexpr auto query(__is_scheduler_affine_t) noexcept -> bool {
5145
return true;
5246
}
5347

54-
[[nodiscard]]
55-
constexpr auto query(get_completion_scheduler_t<set_value_t>) const noexcept -> __scheduler {
48+
STDEXEC_ATTRIBUTE(nodiscard, host, device)
49+
static constexpr auto query(get_completion_scheduler_t<set_value_t>) noexcept //
50+
-> inline_scheduler {
5651
return {};
5752
}
5853
};
59-
} // namespace __inln
6054

61-
template <>
62-
struct __sexpr_impl<__inln::__schedule_t> : __sexpr_defaults {
63-
static constexpr auto get_attrs = [](__ignore) noexcept {
64-
return __inln::__env();
55+
struct __sender {
56+
using __id = __sender;
57+
using __t = __sender;
58+
59+
using sender_concept = sender_t;
60+
using completion_signatures = stdexec::completion_signatures<set_value_t()>;
61+
62+
template <class _Receiver>
63+
STDEXEC_ATTRIBUTE(nodiscard, host, device)
64+
static constexpr auto connect(_Receiver __rcvr) noexcept -> __opstate<_Receiver> {
65+
return {static_cast<_Receiver&&>(__rcvr)};
66+
}
67+
68+
STDEXEC_ATTRIBUTE(nodiscard, host, device)
69+
static constexpr auto get_env() noexcept -> __attrs {
70+
return {};
71+
}
6572
};
6673

67-
static constexpr auto get_completion_signatures =
68-
[](__ignore, __ignore = {}) noexcept -> completion_signatures<set_value_t()> {
74+
public:
75+
using __t = inline_scheduler;
76+
using __id = inline_scheduler;
77+
78+
using scheduler_concept = scheduler_t;
79+
80+
STDEXEC_ATTRIBUTE(nodiscard, host, device)
81+
static constexpr auto schedule() noexcept -> __sender {
6982
return {};
70-
};
83+
}
7184

72-
static constexpr auto start =
73-
[]<class _Receiver>(__ignore, _Receiver& __rcvr) noexcept -> void {
74-
stdexec::set_value(static_cast<_Receiver&&>(__rcvr));
75-
};
85+
auto operator==(const inline_scheduler&) const noexcept -> bool = default;
7686
};
7787

78-
static_assert(__is_scheduler_affine<schedule_result_t<__inln::__scheduler>>);
88+
static_assert(__is_scheduler_affine<schedule_result_t<inline_scheduler>>);
7989
} // namespace stdexec

include/stdexec/__detail/__on.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ namespace stdexec {
146146
// If __is_root_env<_Env> is true, then this sender has no parent, so there is
147147
// no need to restore the execution context. We can use the inline scheduler
148148
// as the scheduler if __env does not have one.
149-
using __default_t = __if_c<__is_root_env<_Env>, __inln::__scheduler, __none_such>;
149+
using __default_t = __if_c<__is_root_env<_Env>, inline_scheduler, __none_such>;
150150

151151
// If scheduler<_Data> is true, then this sender was created with `on(sch, sndr)`.
152152
// In that case, the child sender is not a predecessor, so its completion

test/exec/test_any_sender.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ namespace {
509509

510510
TEST_CASE("any scheduler with inline_scheduler", "[types][any_sender]") {
511511
static_assert(scheduler<my_scheduler<>>);
512-
my_scheduler<> scheduler = exec::inline_scheduler();
512+
my_scheduler<> scheduler = stdexec::inline_scheduler();
513513
my_scheduler<> copied = scheduler;
514514
CHECK(copied == scheduler);
515515

@@ -528,7 +528,7 @@ namespace {
528528
using my_scheduler2 =
529529
my_scheduler<get_forward_progress_guarantee.signature<forward_progress_guarantee()>>;
530530
static_assert(scheduler<my_scheduler2>);
531-
my_scheduler2 scheduler = exec::inline_scheduler();
531+
my_scheduler2 scheduler = stdexec::inline_scheduler();
532532
my_scheduler2 copied = scheduler;
533533
CHECK(copied == scheduler);
534534

@@ -540,7 +540,7 @@ namespace {
540540

541541
CHECK(
542542
get_forward_progress_guarantee(scheduler)
543-
== get_forward_progress_guarantee(exec::inline_scheduler()));
543+
== get_forward_progress_guarantee(stdexec::inline_scheduler()));
544544

545545
bool called = false;
546546
sync_wait(std::move(sched) | then([&] { called = true; }));
@@ -634,7 +634,7 @@ namespace {
634634
any_receiver_ref<completion_signatures<set_stopped_t(), set_error_t(std::exception_ptr)>>;
635635
using sender_t = receiver_ref::any_sender<>;
636636
using scheduler_t = sender_t::any_scheduler<>;
637-
scheduler_t scheduler = exec::inline_scheduler();
637+
scheduler_t scheduler = stdexec::inline_scheduler();
638638
{
639639
auto op = connect(schedule(scheduler), expect_void_receiver{});
640640
stdexec::start(op);
@@ -656,7 +656,7 @@ namespace {
656656
any_receiver_ref<completion_signatures<set_stopped_t(), set_error_t(std::exception_ptr)>>;
657657
using sender_t = receiver_ref::any_sender<>;
658658
using scheduler_t = sender_t::any_scheduler<>;
659-
scheduler_t scheduler = exec::inline_scheduler();
659+
scheduler_t scheduler = stdexec::inline_scheduler();
660660
auto sched = schedule(scheduler);
661661
scheduler = stopped_scheduler();
662662
{
@@ -744,7 +744,7 @@ namespace {
744744
using sender_t = receiver_ref::any_sender<>;
745745
using scheduler_t = sender_t::any_scheduler<>;
746746
{
747-
scheduler_t scheduler = exec::inline_scheduler{};
747+
scheduler_t scheduler = stdexec::inline_scheduler{};
748748
scheduler = counting_scheduler{};
749749
{
750750
auto op = connect(schedule(scheduler), expect_value_receiver<>{});

test/exec/test_task.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ namespace {
174174
}
175175

176176
TEST_CASE("Use two inline schedulers", "[types][sticky][task]") {
177-
scheduler auto scheduler1 = exec::inline_scheduler{};
178-
scheduler auto scheduler2 = exec::inline_scheduler{};
177+
scheduler auto scheduler1 = stdexec::inline_scheduler{};
178+
scheduler auto scheduler2 = stdexec::inline_scheduler{};
179179
sync_wait(when_all(
180180
schedule(scheduler1) | then([] { __thread_id = 0; }),
181181
schedule(scheduler2) | then([] { __thread_id = 0; })));

0 commit comments

Comments
 (0)