14 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \
20 #include <sys/event.h>
30 template<
typename... Tasks>
31 class kevent_task_executor
34 explicit kevent_task_executor(Tasks&... tasks)
41 EV_SET(&event, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0,
nullptr);
43 kevent(queue_fd_, &event, 1,
nullptr, 0,
nullptr));
47 kevent_task_executor(kevent_task_executor
const&) =
delete;
48 kevent_task_executor& operator=(kevent_task_executor
const&) =
delete;
50 ~kevent_task_executor()
60 if (worker_.joinable()) {
63 stop_requested_.store(
false);
64 worker_ = std::thread([
this] {
65 while (!stop_requested_.load()) {
66 if (ready_.run_ready() == 0U) {
75 stop_requested_.store(
true);
77 if (worker_.joinable()) {
91 EV_SET(&event, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0,
nullptr);
92 static_cast<void>(kevent(queue_fd_, &event, 1,
nullptr, 0,
nullptr));
113 static_cast<void>(kevent(queue_fd_,
nullptr, 0, &event, 1, &timeout));
116 [[nodiscard]]
bool step()
118 return ready_.step();
120 std::size_t run_ready()
122 return ready_.run_ready();
127 const auto resumed = ready_.tick(elapsed_ticks);
136 return tick(elapsed_ticks.
count());
144 template<auto Entry, std::
size_t Instance = 0U>
147 auto result = ready_.template start<Entry, Instance>();
154 template<
auto Entry,
typename... Args>
157 auto result = ready_.template spawn<Entry>(std::forward<Args>(args)...);
164 template<auto Entry, std::
size_t Instance = 0U>
167 return ready_.template task_status<Entry, Instance>();
170 template<auto Entry, std::
size_t Instance = 0U>
173 return ready_.template task_failure_reason<Entry, Instance>();
176 template<auto Entry, std::
size_t Instance = 0U>
177 [[nodiscard]]
bool cancel() noexcept
179 const bool cancelled = ready_.template cancel<Entry, Instance>();
186 void cancel_all() noexcept
194 std::thread worker_{};
195 std::atomic_bool stop_requested_{
true };
199 template<
typename... Tasks>
200 kevent_task_executor(Tasks&...) -> kevent_task_executor<Tasks...>;
202 template<
typename... Tasks>
Target-independent executors for tsm runtimes.
tsm::timeout_ticks_awaitable timeout(tick_domain< TickPeriod > domain, Duration duration) noexcept
Definition: chrono_ticks.h:119
cooperative_executor(Tasks &...) -> cooperative_executor< Tasks... >
Definition: bare_metal.h:20
task_failure_reason
Definition: coroutine.h:170
task_status
Definition: coroutine.h:160
bare_metal_task_executor< Tasks... > task_executor
Definition: bare_metal.h:166
spawn_result
Definition: coroutine.h:181
TSM_TICK_REP tick_rep
Definition: ticks.h:35
Strong value type for semantic scheduler ticks.
Definition: ticks.h:54
constexpr tick_rep count() const noexcept
Definition: ticks.h:73