kokkos-execution 0.0.1
Loading...
Searching...
No Matches
test_get_start_scheduler.cpp
Go to the documentation of this file.
1#include "gtest/gtest.h"
2
3#include <thread>
4
6PRAGMA_DIAGNOSTIC_PUSH
8#include "exec/static_thread_pool.hpp"
9PRAGMA_DIAGNOSTIC_POP
10
12
14
25
26namespace Tests {
27
28consteval bool test_is_forwarding_query() {
29 return stdexec::forwarding_query(stdexec::get_start_scheduler);
30}
31
32static_assert(test_is_forwarding_query());
33
38TEST(get_start_scheduler, sync_wait) {
39 std::thread::id tid;
40
41 auto sndr_read_env_start_sch = stdexec::read_env(stdexec::get_start_scheduler) | stdexec::let_value([&](auto schd) {
42 static_assert(std::same_as<decltype(schd), stdexec::run_loop::scheduler>);
43 return stdexec::schedule(schd) | THEN_STORE_THREAD_ID(&tid);
44 });
45
46 stdexec::sync_wait(std::move(sndr_read_env_start_sch)); // NOLINT(performance-move-const-arg)
47
48 ASSERT_EQ(tid, std::this_thread::get_id());
49
56 auto sndr_read_env_delegation_sch = stdexec::read_env(stdexec::get_delegation_scheduler)
57 | stdexec::let_value([&](auto schd) {
58 static_assert(std::same_as<decltype(schd), stdexec::run_loop::scheduler>);
59 return stdexec::schedule(schd) | THEN_STORE_THREAD_ID(&tid);
60 });
61
62 stdexec::sync_wait(std::move(sndr_read_env_delegation_sch)); // NOLINT(performance-move-const-arg)
63
64 ASSERT_EQ(tid, std::this_thread::get_id());
65}
66
77TEST(get_start_scheduler, let_value) {
78 std::thread::id pool_tid, tid;
79
80 experimental::execution::static_thread_pool pool{1};
81
82 auto sndr = stdexec::schedule(pool.get_scheduler()) | THEN_STORE_THREAD_ID(&pool_tid) | stdexec::let_value([&]() {
83 return stdexec::read_env(stdexec::get_start_scheduler) | stdexec::let_value([&](auto schd) {
84 static_assert(std::same_as<decltype(schd), decltype(pool.get_scheduler())>);
85 return stdexec::schedule(schd) | THEN_STORE_THREAD_ID(&tid);
86 });
87 });
88
89 stdexec::sync_wait(std::move(sndr)); // NOLINT(performance-move-const-arg)
90
91 ASSERT_EQ(tid, pool_tid);
92 ASSERT_NE(tid, std::this_thread::get_id());
93}
94
99TEST(get_start_scheduler, continues_on) {
100 std::thread::id pool_tid, tid;
101
102 experimental::execution::static_thread_pool pool{1};
103
104 auto sndr = stdexec::schedule(pool.get_scheduler()) | THEN_STORE_THREAD_ID(&pool_tid)
105 | stdexec::continues_on(stdexec::inline_scheduler{}) | THEN_STORE_THREAD_ID(&tid);
106
107 static_assert(std::same_as<
108 stdexec::__completion_scheduler_of_t<
109 stdexec::set_value_t,
110 decltype(sndr),
111 stdexec::prop<stdexec::get_start_scheduler_t, stdexec::run_loop::scheduler>
112 >,
113 decltype(pool.get_scheduler())
114 >);
115
116 stdexec::sync_wait(std::move(sndr)); // NOLINT(performance-move-const-arg)
117
118 ASSERT_EQ(tid, pool_tid);
119 ASSERT_NE(tid, std::this_thread::get_id());
120}
121
128TEST(get_start_scheduler, continues_on_error_completion) {
129 experimental::execution::static_thread_pool pool{1};
130 std::thread::id pool_tid, tid;
131
132 auto sndr = stdexec::schedule(pool.get_scheduler()) | THEN_STORE_THREAD_ID(&pool_tid)
133 | stdexec::then([]() { throw std::runtime_error{"error"}; })
134 | stdexec::continues_on(stdexec::inline_scheduler{});
135
136 static_assert(std::same_as<
137 stdexec::__completion_scheduler_of_t<
138 stdexec::set_error_t,
139 decltype(sndr),
140 stdexec::prop<stdexec::get_start_scheduler_t, stdexec::run_loop::scheduler>
141 >,
142 decltype(pool.get_scheduler())
143 >);
144
145 auto sndr_with_upon_error = std::move(sndr) // NOLINT(performance-move-const-arg)
147
148 static_assert(stdexec::__never_sends<
149 stdexec::set_error_t,
150 decltype(sndr_with_upon_error),
151 stdexec::prop<stdexec::get_start_scheduler_t, stdexec::run_loop::scheduler>
152 >);
153
154 static_assert(std::same_as<
155 stdexec::__completion_scheduler_of_t<
156 stdexec::set_value_t,
157 decltype(sndr_with_upon_error),
158 stdexec::prop<stdexec::get_start_scheduler_t, stdexec::run_loop::scheduler>
159 >,
160 decltype(pool.get_scheduler())
161 >);
162
163 stdexec::sync_wait(std::move(sndr_with_upon_error)); // NOLINT(performance-move-const-arg)
164
165 ASSERT_EQ(tid, pool_tid);
166 ASSERT_NE(tid, std::this_thread::get_id());
167}
168
169} // namespace Tests
#define KOKKOS_EXECUTION_STDEXEC_PRAGMA_DIAGNOSTIC_IGNORED
Basic list of ignored diagnostics when including anything from stdexec.
consteval bool test_is_forwarding_query()
#define THEN_STORE_THREAD_ID(__id__)
Add a stdexec::then calling Tests::Utils::Functors::StoreThreadID. // NOLINTNEXTLINE(cppcoreguideline...
#define UPON_ERROR_STORE_THREAD_ID(__id__)
Add a stdexec::upon_error calling Tests::Utils::Functors::StoreThreadID. // NOLINTNEXTLINE(cppcoregui...