18template<concepts::Lock Lock = DefaultLock>
23 OperationStateBase(
RunLoop* parent_) : parent(parent_) {}
30 template<
typename Receiver>
31 struct OperationStateT {
32 struct Type : OperationStateBase {
34 Type(
RunLoop* parent, Receiver&& receiver) : OperationStateBase(parent), m_receiver(
util::move(receiver)) {}
45 void do_start() { this->parent->push_back(
this); }
49 [[no_unique_address]] Receiver m_receiver;
53 template<
typename Receiver>
59 using is_sender = void;
66 template<concepts::ReceiverOf<CompletionSignatures> Receiver>
68 return OperationState<Receiver> { self.parent, util::move(receiver) };
74 template<
typename CPO>
75 constexpr friend auto tag_invoke(GetCompletionScheduler<CPO>, Env
const& self) {
76 return Scheduler { self.parent };
89 constexpr friend auto operator==(Scheduler
const&, Scheduler
const&) ->
bool =
default;
93 Queue<OperationStateBase, IntrusiveForwardList<OperationStateBase>> queue;
94 bool stopped {
false };
104 while (
auto* operation = pop_front()) {
105 operation->execute();
110 m_state.with_lock([](State& state) {
111 state.stopped =
true;
116 auto pop_front() -> OperationStateBase* {
124 if (!state.queue.empty()) {
125 return make_tuple(util::addressof(*state.queue.pop()),
false);
140 void push_back(OperationStateBase* operation) {
141 m_state.with_lock([&](State& state) {
142 state.queue.push(*operation);
Definition forward_list_node.h:9
void run()
Definition run_loop.h:103
auto get_scheduler() -> Scheduler
Definition run_loop.h:101
RunLoop(RunLoop &&)=delete
void finish()
Definition run_loop.h:109
Definition tuple_forward_declaration.h:5
constexpr auto execute
Executes a function on a scheduler.
Definition execute.h:45
constexpr auto set_stopped
Definition set_stopped.h:14
constexpr auto get_stop_token
Definition get_stop_token.h:25
constexpr auto set_value
Definition set_value.h:14
Synchronized(T &&) -> Synchronized< T >
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition zstring_parser.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto make_tuple(Args &&... args)
Definition make_tuple.h:9
friend void tag_invoke(types::Tag< start >, Type &self)
Definition run_loop.h:47
void execute() override
Definition run_loop.h:36
Type(RunLoop *parent, Receiver &&receiver)
Definition run_loop.h:34
Definition set_stopped.h:6
Definition completion_signuatures.h:7