3#include "di/assert/prelude.h"
4#include "di/container/algorithm/copy.h"
5#include "di/container/algorithm/prelude.h"
6#include "di/container/intrusive/prelude.h"
7#include "di/container/queue/prelude.h"
8#include "di/execution/interface/connect.h"
9#include "di/execution/interface/run.h"
10#include "di/execution/io/async_net.h"
11#include "di/execution/meta/connect_result.h"
12#include "di/execution/prelude.h"
13#include "di/execution/query/make_env.h"
14#include "di/execution/receiver/prelude.h"
15#include "di/execution/sequence/sequence_sender.h"
16#include "di/execution/types/completion_signuatures.h"
17#include "di/function/make_deferred.h"
18#include "di/function/prelude.h"
19#include "di/meta/operations.h"
20#include "di/platform/compiler.h"
21#include "di/util/addressof.h"
22#include "di/vocab/optional/prelude.h"
23#include "di/vocab/variant/prelude.h"
24#include "dius/c_definitions.h"
34struct IoUringContextImpl;
42template<di::concepts::Invocable<io_uring::SQE*> Fun>
57 static auto create() -> di::Result<IoUringContext>;
73 di::Queue<OperationStateBase, di::IntrusiveForwardList<OperationStateBase>>
m_queue;
90 template<
typename CPO>
91 constexpr friend auto tag_invoke(di::execution::GetCompletionScheduler<CPO>,
Env const& self) {
91 constexpr friend auto tag_invoke(di::execution::GetCompletionScheduler<CPO>,
Env const& self) {
…}
101 di::CompletionSignatures<di::SetValue(
size_t), di::SetError(di::Error), di::SetStopped()>;
109 template<
typename Rec>
110 struct OperationStateT {
113 di::Optional<u64>
offset, Rec receiver)
118 , m_receiver(
di::move(receiver)) {}
121 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
122 di::execution::set_stopped(di::move(m_receiver));
125 enqueue_io_operation(m_parent,
this, [&](
auto* sqe) {
126 sqe->opcode = IORING_OP_READ;
127 sqe->fd = m_file_descriptor;
128 sqe->off = m_offset.value_or((u64) -1);
129 sqe->addr =
reinterpret_cast<u64
>(m_buffer.data());
130 sqe->len = m_buffer.size();
137 di::execution::set_error(di::move(m_receiver), di::Error(
PosixError(-cqe->res)));
139 di::execution::set_value(di::move(m_receiver),
static_cast<size_t>(cqe->res));
149 int m_file_descriptor;
150 di::Span<di::Byte> m_buffer;
151 di::Optional<u64> m_offset;
152 [[no_unique_address]] Rec m_receiver;
156 template<di::ReceiverOf<CompletionSignatures> Receiver>
157 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
159 template<di::ReceiverOf<CompletionSignatures> Receiver>
162 di::move(receiver) };
175 di::CompletionSignatures<di::SetValue(
size_t), di::SetError(di::Error), di::SetStopped()>;
183 template<
typename Rec>
184 struct OperationStateT {
187 di::Optional<u64>
offset, Rec receiver)
192 , m_receiver(
di::move(receiver)) {}
195 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
196 di::execution::set_stopped(di::move(m_receiver));
199 enqueue_io_operation(m_parent,
this, [&](
auto* sqe) {
200 sqe->opcode = IORING_OP_WRITE;
201 sqe->fd = m_file_descriptor;
202 sqe->off = m_offset.value_or((u64) -1);
203 sqe->addr =
reinterpret_cast<u64
>(m_buffer.data());
204 sqe->len = m_buffer.size();
211 di::execution::set_error(di::move(m_receiver), di::Error(
PosixError(-cqe->res)));
213 di::execution::set_value(di::move(m_receiver),
static_cast<size_t>(cqe->res));
223 int m_file_descriptor;
224 di::Span<di::Byte const> m_buffer;
225 di::Optional<u64> m_offset;
226 [[no_unique_address]] Rec m_receiver;
230 template<di::ReceiverOf<CompletionSignatures> Receiver>
231 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
233 template<di::ReceiverOf<CompletionSignatures> Receiver>
236 di::move(receiver) };
248 using CompletionSignatures = di::CompletionSignatures<di::SetValue(), di::SetError(di::Error), di::SetStopped()>;
254 template<
typename Rec>
255 struct OperationStateT {
261 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
262 di::execution::set_stopped(di::move(m_receiver));
265 enqueue_io_operation(m_parent,
this, [&](
auto* sqe) {
266 sqe->opcode = IORING_OP_CLOSE;
267 sqe->fd = m_file_descriptor;
274 di::execution::set_error(di::move(m_receiver), di::Error(
PosixError(-cqe->res)));
276 di::execution::set_value(di::move(m_receiver));
286 int m_file_descriptor;
287 [[no_unique_address]] Rec m_receiver;
291 template<di::ReceiverOf<CompletionSignatures> Receiver>
292 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
294 template<di::ReceiverOf<CompletionSignatures> Receiver>
308 using CompletionSignatures = di::CompletionSignatures<di::SetValue(), di::SetError(di::Error), di::SetStopped()>;
315 template<
typename Rec>
316 struct OperationStateT {
320 if (
address.path().size() < 108 - 1) {
321 sockaddr_un addr = {};
323 di::copy(
address.path(), addr.sun_path);
329 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
330 di::execution::set_stopped(di::move(m_receiver));
334 di::execution::set_error(di::move(m_receiver), di::Error(dius::PosixError::FilenameTooLong));
339 enqueue_io_operation(m_parent,
this, [&](
auto* sqe) {
340 sqe->opcode = IORING_OP_CONNECT;
341 sqe->fd = m_file_descriptor;
342 sqe->addr = (u64) di::addressof(m_address.value());
343 sqe->off =
sizeof(m_address.value());
350 di::execution::set_error(di::move(m_receiver), di::Error(
PosixError(-cqe->res)));
352 di::execution::set_value(di::move(m_receiver));
362 int m_file_descriptor { -1 };
363 di::Optional<sockaddr_un> m_address;
364 [[no_unique_address]] Rec m_receiver;
368 template<di::ReceiverOf<CompletionSignatures> Receiver>
369 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
371 template<di::ReceiverOf<CompletionSignatures> Receiver>
374 di::move(receiver) };
386 using CompletionSignatures = di::CompletionSignatures<di::SetValue(), di::SetError(di::Error), di::SetStopped()>;
393 template<
typename Rec>
394 struct OperationStateT {
398 if (
address.path().size() < 108 - 1) {
399 sockaddr_un addr = {};
401 di::copy(
address.path(), addr.sun_path);
407 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
408 di::execution::set_stopped(di::move(m_receiver));
412 di::execution::set_error(di::move(m_receiver), di::Error(dius::PosixError::FilenameTooLong));
418 di::addressof(m_address.value()),
sizeof(m_address.value()));
419 if (!result.has_value()) {
420 di::execution::set_error(di::move(m_receiver), di::Error(di::move(result).error()));
422 di::execution::set_value(di::move(m_receiver));
433 int m_file_descriptor { -1 };
434 di::Optional<sockaddr_un> m_address;
435 [[no_unique_address]] Rec m_receiver;
439 template<di::ReceiverOf<CompletionSignatures> Receiver>
440 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
442 template<di::ReceiverOf<CompletionSignatures> Receiver>
445 di::move(receiver) };
457 using CompletionSignatures = di::CompletionSignatures<di::SetValue(), di::SetError(di::Error), di::SetStopped()>;
464 template<
typename Rec>
465 struct OperationStateT {
471 , m_receiver(
di::move(receiver)) {}
474 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
475 di::execution::set_stopped(di::move(m_receiver));
479 if (!result.has_value()) {
480 di::execution::set_error(di::move(m_receiver), di::Error(di::move(result).error()));
482 di::execution::set_value(di::move(m_receiver));
493 int m_file_descriptor { -1 };
495 [[no_unique_address]] Rec m_receiver;
499 template<di::ReceiverOf<CompletionSignatures> Receiver>
500 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
502 template<di::ReceiverOf<CompletionSignatures> Receiver>
516 using CompletionSignatures = di::CompletionSignatures<di::SetValue(), di::SetError(di::Error), di::SetStopped()>;
523 template<
typename Rec>
524 struct OperationStateT {
530 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
531 di::execution::set_stopped(di::move(m_receiver));
534 enqueue_io_operation(m_parent,
this, [&](
auto* sqe) {
535 sqe->opcode = IORING_OP_SHUTDOWN;
536 sqe->fd = m_file_descriptor;
537 sqe->len = (u32) m_how;
544 di::execution::set_error(di::move(m_receiver), di::Error(
PosixError(-cqe->res)));
546 di::execution::set_value(di::move(m_receiver));
556 int m_file_descriptor { -1 };
558 [[no_unique_address]] Rec m_receiver;
562 template<di::ReceiverOf<CompletionSignatures> Receiver>
563 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
565 template<di::ReceiverOf<CompletionSignatures> Receiver>
584 template<
typename Rec>
585 struct OperationStateT {
591 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
592 di::execution::set_stopped(di::move(m_receiver));
594 di::execution::set_value(di::move(m_receiver));
604 [[no_unique_address]] Rec m_receiver;
608 template<di::Receiver Rec>
609 using OperationState = di::meta::Type<OperationStateT<Rec>>;
611 template<di::ReceiverOf<CompletionSignatures> Rec>
613 return OperationState<Rec> { self.
parent, di::move(receiver) };
627 auto path() const ->
di::Path const& {
return m_path; }
631 auto fd() const ->
int {
return m_fd; }
635 friend auto tag_invoke(di::Tag<di::execution::async_read_some>,
AsyncFile& self, di::Span<di::Byte> buffer,
636 di::Optional<u64> offset) {
637 return ReadSomeSender { self.m_parent, self.m_fd, buffer, offset };
635 friend auto tag_invoke(di::Tag<di::execution::async_read_some>,
AsyncFile& self, di::Span<di::Byte> buffer, {
…}
640 friend auto tag_invoke(di::Tag<di::execution::async_write_some>,
AsyncFile& self, di::Span<di::Byte const> buffer,
641 di::Optional<u64> offset) {
640 friend auto tag_invoke(di::Tag<di::execution::async_write_some>,
AsyncFile& self, di::Span<di::Byte const> buffer, {
…}
656 auto base_fd() const ->
int {
return m_base_fd; }
659 int m_base_fd { -1 };
662template<
typename Base>
664 :
public di::Immovable
667 template<
typename... Args>
668 requires(di::concepts::ConstructibleFrom<Base, Args...>)
670 : Base(di::forward<Args>(args)...), m_parent(context) {}
674 auto fd() const ->
int {
return m_fd; }
683 friend auto tag_invoke(di::Tag<di::execution::async_write_some>,
AsyncSocket& self, di::Span<di::Byte const> buffer,
689 return BindSender { self.m_parent, self.m_fd, di::move(address) };
693 return ConnectSender { self.m_parent, self.m_fd, di::move(address) };
697 return ListenSender { self.m_parent, self.m_fd, count };
705 return di::make_deferred<AsyncSocket<AcceptSocket>>(self.m_parent, self.m_fd);
717 di::SetError(di::Error), di::SetStopped()>;
720 di::ReferenceWrapper<AsyncFile>
file;
723 template<
typename Rec>
724 struct OperationStateT {
727 : m_parent(
parent), m_file(
file), m_receiver(
di::move(receiver)) {}
730 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
731 di::execution::set_stopped(di::move(m_receiver));
733 auto open_mode_flags = [&] {
734 switch (m_file.get().mode()) {
738 return O_WRONLY | O_EXCL | O_CREAT;
740 return O_WRONLY | O_TRUNC | O_CREAT;
744 return O_WRONLY | O_APPEND | O_CREAT;
751 enqueue_io_operation(m_parent,
this, [&](
auto* sqe) {
752 sqe->opcode = IORING_OP_OPENAT;
754 sqe->addr =
reinterpret_cast<u64
>(m_file.get().path().c_str());
755 sqe->len = m_file.get().create_mode();
756 sqe->open_flags = open_mode_flags;
763 di::execution::set_error(di::move(m_receiver), di::Error(
PosixError(-cqe->res)));
765 m_file.get().set_fd(cqe->res);
766 di::execution::set_value(di::move(m_receiver), di::ref(m_file));
776 di::ReferenceWrapper<AsyncFile> m_file;
777 [[no_unique_address]] Rec m_receiver;
781 template<di::ReceiverOf<CompletionSignatures> Receiver>
782 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
784 template<di::ReceiverOf<CompletionSignatures> Receiver>
786 return OperationState<Receiver> { self.
parent, self.
file, di::move(receiver) };
801 di::SetError(di::Error), di::SetStopped()>;
804 di::ReferenceWrapper<AsyncSocket>
socket;
807 template<
typename Rec>
808 struct OperationStateT {
811 : m_parent(
parent), m_socket(
socket), m_receiver(
di::move(receiver)) {}
814 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
815 di::execution::set_stopped(di::move(m_receiver));
818 enqueue_io_operation(m_parent,
this, [&](
auto* sqe) {
819 sqe->opcode = IORING_OP_SOCKET;
828 di::execution::set_error(di::move(m_receiver), di::Error(
PosixError(-cqe->res)));
830 m_socket.get().set_fd(cqe->res);
831 di::execution::set_value(di::move(m_receiver), di::ref(m_socket));
841 di::ReferenceWrapper<AsyncSocket> m_socket;
842 [[no_unique_address]] Rec m_receiver;
846 template<di::ReceiverOf<CompletionSignatures> Receiver>
847 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
849 template<di::ReceiverOf<CompletionSignatures> Receiver>
851 return OperationState<Receiver> { self.
parent, self.
socket, di::move(receiver) };
866 di::SetError(di::Error), di::SetStopped()>;
869 di::ReferenceWrapper<AsyncSocket>
socket;
872 template<
typename Rec>
873 struct OperationStateT {
876 : m_parent(
parent), m_socket(
socket), m_receiver(
di::move(receiver)) {}
879 if (di::execution::get_stop_token(m_receiver).stop_requested()) {
880 di::execution::set_stopped(di::move(m_receiver));
883 enqueue_io_operation(m_parent,
this, [&](
auto* sqe) {
884 sqe->opcode = IORING_OP_ACCEPT;
885 sqe->fd = m_socket.get().base_fd();
892 di::execution::set_error(di::move(m_receiver), di::Error(
PosixError(-cqe->res)));
894 m_socket.get().set_fd(cqe->res);
895 di::execution::set_value(di::move(m_receiver), di::ref(m_socket));
905 di::ReferenceWrapper<AsyncSocket> m_socket;
906 [[no_unique_address]] Rec m_receiver;
910 template<di::ReceiverOf<CompletionSignatures> Receiver>
911 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
913 template<di::ReceiverOf<CompletionSignatures> Receiver>
915 return OperationState<Receiver> { self.
parent, self.
socket, di::move(receiver) };
923template<
typename Object,
typename CreateSend>
929 di::CompletionSignatures<di::SetValue(di::ReferenceWrapper<Object>), di::SetError(di::Error), di::SetStopped()>;
935 template<
typename Rec>
936 struct OperationStateT {
943 friend auto tag_invoke(di::Tag<di::execution::set_value>,
Rec1&& self) { self.complete(); }
944 friend auto tag_invoke(di::Tag<di::execution::set_stopped>,
Rec1&& self) { self.complete(); }
947 struct Rec2 : di::ReceiverAdaptor<Rec2> {
949 using Base = di::ReceiverAdaptor<Rec2>;
953 explicit Rec2(Rec* receiver) : m_receiver(receiver) {}
955 auto base() const& -> Rec const& {
return *m_receiver; }
956 auto base() && -> Rec&& {
return di::move(*m_receiver); }
947 struct Rec2 : di::ReceiverAdaptor<Rec2> {
…};
963 : m_parent(
parent), m_object(
object), m_receiver(
di::move(receiver)) {}
966 using NextSender = di::meta::NextSenderOf<Rec, CreateSend>;
967 using Op1 = di::meta::ConnectResult<NextSender, Rec1>;
968 using Op2 = di::meta::ConnectResult<CloseSender, Rec2>;
970 void finish_phase1() {
971 auto& op = m_op.template emplace<2>(di::DeferConstruct([&] {
972 return di::execution::connect(
CloseSender(m_parent, m_object.get().fd()),
973 Rec2(di::addressof(m_receiver)));
975 di::execution::start(op);
979 auto& op = self.m_op.template emplace<1>(di::DeferConstruct([&] {
980 return di::execution::connect(
981 di::execution::set_next(self.m_receiver, CreateSend(self.m_parent, self.m_object)),
983 return self.finish_phase1();
986 di::execution::start(op);
990 di::ReferenceWrapper<Object> m_object;
991 [[no_unique_address]] Rec m_receiver;
992 DI_IMMOVABLE_NO_UNIQUE_ADDRESS di::Variant<di::Void, Op1, Op2> m_op;
996 template<
typename Receiver>
997 using OperationState = di::meta::Type<OperationStateT<Receiver>>;
1000 di::ReceiverOf<di::CompletionSignatures<di::SetValue(), di::SetError(di::Error), di::SetStopped()>> Receiver>
1002 return OperationState<Receiver> { self.
parent, self.
object, di::move(receiver) };
1006 return di::execution::make_env(
Env(self.
parent),
1007 di::execution::with(di::execution::get_sequence_cardinality, di::c_<1ZU>));
1024 return { self.parent };
1029 return di::make_deferred<AsyncFile>(self.
parent, di::move(path), mode, create_mode);
1033 return di::make_deferred<AsyncFile>(self.
parent, di::move(path), mode, 0666);
1037 return di::make_deferred<AsyncSocket<di::Void>>(self.
parent);
1044template<di::concepts::Invocable<io_uring::SQE*> Fun>
1048 di::fill_n(
reinterpret_cast<di::Byte*
>(sqe.data()),
sizeof(sqe), 0_b);
1049 di::invoke(di::forward<Fun>(function), sqe.data());
1050 sqe->user_data =
reinterpret_cast<uintptr_t
>(op);
AcceptSocket(int base_fd)
Definition io_uring_context.h:654
auto base_fd() const -> int
Definition io_uring_context.h:656
Definition io_uring_context.h:621
auto mode() const -> OpenMode
Definition io_uring_context.h:628
friend auto tag_invoke(di::Tag< di::execution::async_read_some >, AsyncFile &self, di::Span< di::Byte > buffer, di::Optional< u64 > offset)
Definition io_uring_context.h:635
friend auto tag_invoke(di::Tag< di::execution::async_write_some >, AsyncFile &self, di::Span< di::Byte const > buffer, di::Optional< u64 > offset)
Definition io_uring_context.h:640
auto path() const -> di::Path const &
Definition io_uring_context.h:627
auto create_mode() const -> u16
Definition io_uring_context.h:629
auto parent() const -> IoUringContext *
Definition io_uring_context.h:626
auto fd() const -> int
Definition io_uring_context.h:631
AsyncFile(IoUringContext *parent, di::Path path, OpenMode mode, u16 create_mode)
Definition io_uring_context.h:623
void set_fd(int fd)
Definition io_uring_context.h:632
Definition io_uring_context.h:665
void set_fd(int fd)
Definition io_uring_context.h:675
AsyncSocket(IoUringContext *context, Args &&... args)
Definition io_uring_context.h:669
friend auto tag_invoke(di::Tag< di::execution::async_accept >, AsyncSocket &self)
Definition io_uring_context.h:704
friend auto tag_invoke(di::Tag< di::execution::async_write_some >, AsyncSocket &self, di::Span< di::Byte const > buffer, di::Optional< u64 >)
Definition io_uring_context.h:683
friend auto tag_invoke(di::Tag< di::execution::async_connect >, AsyncSocket &self, net::UnixAddress address)
Definition io_uring_context.h:692
friend auto tag_invoke(di::Tag< di::execution::async_bind >, AsyncSocket &self, net::UnixAddress address)
Definition io_uring_context.h:688
friend auto tag_invoke(di::Tag< di::execution::async_read_some >, AsyncSocket &self, di::Span< di::Byte > buffer, di::Optional< u64 >)
Definition io_uring_context.h:678
friend auto tag_invoke(di::Tag< di::execution::async_listen >, AsyncSocket &self, int count)
Definition io_uring_context.h:696
auto fd() const -> int
Definition io_uring_context.h:674
friend auto tag_invoke(di::Tag< di::execution::async_shutdown >, AsyncSocket &self, net::Shutdown how)
Definition io_uring_context.h:700
auto parent() const -> IoUringContext *
Definition io_uring_context.h:672
static auto create() -> di::Result< IoUringHandle >
auto get_next_sqe() -> di::Optional< SQE & >
struct io_uring_cqe CQE
Definition io_uring.h:13
void enqueue_operation(IoUringContext *, OperationStateBase *)
Definition io_uring_context.h:1053
auto get_scheduler(IoUringContext *) -> IoUringScheduler
Definition io_uring_context.h:1057
auto tag_invoke(di::Tag< di::execution::run >, AsyncFile &self)
Definition io_uring_context.h:1011
Shutdown
Definition socket.h:4
PosixError
Definition platform_error.h:7
@ bind
Definition system_call.h:36
@ listen
Definition system_call.h:37
auto system_call(Number number) -> di::Expected< R, di::BasicError >
Definition system_call.h:61
OpenMode
Definition sync_file.h:109
@ Readonly
Definition sync_file.h:109
@ WriteNew
Definition sync_file.h:109
@ AppendOnly
Definition sync_file.h:109
@ ReadWrite
Definition sync_file.h:109
@ WriteClobber
Definition sync_file.h:109
Type(IoUringContext *parent, di::ReferenceWrapper< AsyncSocket > socket, Rec &&receiver)
Definition io_uring_context.h:875
void did_complete(io_uring::CQE const *cqe) override
Definition io_uring_context.h:890
void execute() override
Definition io_uring_context.h:878
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:900
Definition io_uring_context.h:859
linux::AsyncSocket< AcceptSocket > AsyncSocket
Definition io_uring_context.h:863
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, AcceptSender const &self)
Definition io_uring_context.h:918
di::ReferenceWrapper< AsyncSocket > socket
Definition io_uring_context.h:869
void is_sender
Definition io_uring_context.h:861
di::CompletionSignatures< di::SetValue(di::ReferenceWrapper< AsyncSocket >), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:865
IoUringContext * parent
Definition io_uring_context.h:868
friend auto tag_invoke(di::Tag< di::execution::connect >, AcceptSender self, Receiver receiver)
Definition io_uring_context.h:914
void execute() override
Definition io_uring_context.h:406
Type(IoUringContext *parent, int file_descriptor, net::UnixAddress address, Rec receiver)
Definition io_uring_context.h:396
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:428
Definition io_uring_context.h:382
int file_descriptor
Definition io_uring_context.h:389
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, BindSender const &self)
Definition io_uring_context.h:448
di::CompletionSignatures< di::SetValue(), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:386
void is_sender
Definition io_uring_context.h:384
friend auto tag_invoke(di::Tag< di::execution::connect >, BindSender self, Receiver receiver)
Definition io_uring_context.h:443
IoUringContext * parent
Definition io_uring_context.h:388
net::UnixAddress address
Definition io_uring_context.h:390
Type(IoUringContext *parent, int file_descriptor, Rec receiver)
Definition io_uring_context.h:257
void did_complete(io_uring::CQE const *cqe) override
Definition io_uring_context.h:272
void execute() override
Definition io_uring_context.h:260
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:281
Definition io_uring_context.h:244
void is_sender
Definition io_uring_context.h:246
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, CloseSender const &self)
Definition io_uring_context.h:299
int file_descriptor
Definition io_uring_context.h:251
friend auto tag_invoke(di::Tag< di::execution::connect >, CloseSender self, Receiver receiver)
Definition io_uring_context.h:295
di::CompletionSignatures< di::SetValue(), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:248
IoUringContext * parent
Definition io_uring_context.h:250
void execute() override
Definition io_uring_context.h:328
Type(IoUringContext *parent, int file_descriptor, net::UnixAddress address, Rec receiver)
Definition io_uring_context.h:318
void did_complete(io_uring::CQE const *cqe) override
Definition io_uring_context.h:348
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:357
Definition io_uring_context.h:304
di::CompletionSignatures< di::SetValue(), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:308
int file_descriptor
Definition io_uring_context.h:311
void is_sender
Definition io_uring_context.h:306
IoUringContext * parent
Definition io_uring_context.h:310
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, ConnectSender const &self)
Definition io_uring_context.h:377
friend auto tag_invoke(di::Tag< di::execution::connect >, ConnectSender self, Receiver receiver)
Definition io_uring_context.h:372
net::UnixAddress address
Definition io_uring_context.h:312
Definition io_uring_context.h:87
constexpr friend auto tag_invoke(di::execution::GetCompletionScheduler< CPO >, Env const &self)
Definition io_uring_context.h:91
IoUringContext * parent
Definition io_uring_context.h:88
Definition io_uring_context.h:55
di::Queue< OperationStateBase, di::IntrusiveForwardList< OperationStateBase > > m_queue
Definition io_uring_context.h:73
void finish()
Definition io_uring_context.h:66
di::Atomic< bool > m_done
Definition io_uring_context.h:74
static auto create() -> di::Result< IoUringContext >
Definition io_uring_context.h:1040
io_uring::IoUringHandle m_handle
Definition io_uring_context.h:72
IoUringContext(IoUringContext &&other)
Definition io_uring_context.h:59
auto get_scheduler() -> IoUringScheduler
Definition io_uring_context.h:1061
Definition io_uring_context.h:77
friend auto tag_invoke(di::Tag< di::execution::schedule >, IoUringScheduler const &self) -> ScheduleSender
Definition io_uring_context.h:1023
IoUringContext * parent
Definition io_uring_context.h:79
constexpr friend auto operator==(IoUringScheduler const &, IoUringScheduler const &) -> bool=default
void execute() override
Definition io_uring_context.h:473
Type(IoUringContext *parent, int file_descriptor, int count, Rec receiver)
Definition io_uring_context.h:467
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:488
Definition io_uring_context.h:453
void is_sender
Definition io_uring_context.h:455
IoUringContext * parent
Definition io_uring_context.h:459
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, ListenSender const &self)
Definition io_uring_context.h:507
int file_descriptor
Definition io_uring_context.h:460
int count
Definition io_uring_context.h:461
di::CompletionSignatures< di::SetValue(), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:457
friend auto tag_invoke(di::Tag< di::execution::connect >, ListenSender self, Receiver receiver)
Definition io_uring_context.h:503
void did_complete(io_uring::CQE const *cqe) override
Definition io_uring_context.h:826
void execute() override
Definition io_uring_context.h:813
Type(IoUringContext *parent, di::ReferenceWrapper< AsyncSocket > socket, Rec &&receiver)
Definition io_uring_context.h:810
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:836
Definition io_uring_context.h:794
di::ReferenceWrapper< AsyncSocket > socket
Definition io_uring_context.h:804
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, MakeSocketSender const &self)
Definition io_uring_context.h:854
friend auto tag_invoke(di::Tag< di::execution::connect >, MakeSocketSender self, Receiver receiver)
Definition io_uring_context.h:850
linux::AsyncSocket< di::Void > AsyncSocket
Definition io_uring_context.h:798
void is_sender
Definition io_uring_context.h:796
IoUringContext * parent
Definition io_uring_context.h:803
di::CompletionSignatures< di::SetValue(di::ReferenceWrapper< AsyncSocket >), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:800
void did_complete(io_uring::CQE const *cqe) override
Definition io_uring_context.h:761
Type(IoUringContext *parent, di::ReferenceWrapper< AsyncFile > file, Rec &&receiver)
Definition io_uring_context.h:726
void execute() override
Definition io_uring_context.h:729
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:771
Definition io_uring_context.h:712
friend auto tag_invoke(di::Tag< di::execution::connect >, OpenSender self, Receiver receiver)
Definition io_uring_context.h:785
di::CompletionSignatures< di::SetValue(di::ReferenceWrapper< AsyncFile >), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:716
di::ReferenceWrapper< AsyncFile > file
Definition io_uring_context.h:720
void is_sender
Definition io_uring_context.h:714
IoUringContext * parent
Definition io_uring_context.h:719
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, OpenSender const &self)
Definition io_uring_context.h:789
Definition io_uring_context.h:49
virtual void did_complete(io_uring::CQE const *)
Definition io_uring_context.h:52
void did_complete(io_uring::CQE const *cqe) override
Definition io_uring_context.h:135
void execute() override
Definition io_uring_context.h:120
Type(IoUringContext *parent, int file_descriptor, di::Span< di::Byte > buffer, di::Optional< u64 > offset, Rec receiver)
Definition io_uring_context.h:112
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:144
Definition io_uring_context.h:96
void is_sender
Definition io_uring_context.h:98
friend auto tag_invoke(di::Tag< di::execution::connect >, ReadSomeSender self, Receiver receiver)
Definition io_uring_context.h:160
int file_descriptor
Definition io_uring_context.h:104
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, ReadSomeSender const &self)
Definition io_uring_context.h:165
di::Span< di::Byte > buffer
Definition io_uring_context.h:105
IoUringContext * parent
Definition io_uring_context.h:103
di::Optional< u64 > offset
Definition io_uring_context.h:106
di::CompletionSignatures< di::SetValue(size_t), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:100
Definition io_uring_context.h:938
friend auto tag_invoke(di::Tag< di::execution::set_value >, Rec1 &&self)
Definition io_uring_context.h:943
void is_receiver
Definition io_uring_context.h:939
friend auto tag_invoke(di::Tag< di::execution::set_stopped >, Rec1 &&self)
Definition io_uring_context.h:944
di::Function< void()> complete
Definition io_uring_context.h:941
auto base() const &-> Rec const &
Definition io_uring_context.h:955
Rec2(Rec *receiver)
Definition io_uring_context.h:953
auto base() &&-> Rec &&
Definition io_uring_context.h:956
Type(IoUringContext *parent, di::ReferenceWrapper< Object > object, Rec &&receiver)
Definition io_uring_context.h:962
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:978
Definition io_uring_context.h:924
di::SequenceTag is_sender
Definition io_uring_context.h:926
di::CompletionSignatures< di::SetValue(di::ReferenceWrapper< Object >), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:928
friend auto tag_invoke(di::Tag< di::execution::subscribe >, RunSender self, Receiver receiver)
Definition io_uring_context.h:1001
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, RunSender const &self)
Definition io_uring_context.h:1005
IoUringContext * parent
Definition io_uring_context.h:931
di::ReferenceWrapper< Object > object
Definition io_uring_context.h:932
void execute() override
Definition io_uring_context.h:590
Type(IoUringContext *parent, Rec &&receiver)
Definition io_uring_context.h:588
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:599
Definition io_uring_context.h:575
friend auto tag_invoke(di::Tag< di::execution::connect >, ScheduleSender self, Rec receiver)
Definition io_uring_context.h:612
IoUringContext * parent
Definition io_uring_context.h:581
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, ScheduleSender const &self)
Definition io_uring_context.h:616
void is_sender
Definition io_uring_context.h:577
di::CompletionSignatures< di::SetValue(), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:579
void execute() override
Definition io_uring_context.h:529
Type(IoUringContext *parent, int file_descriptor, net::Shutdown how, Rec receiver)
Definition io_uring_context.h:526
void did_complete(io_uring::CQE const *cqe) override
Definition io_uring_context.h:542
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:551
Definition io_uring_context.h:512
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, ShutdownSender const &self)
Definition io_uring_context.h:570
int file_descriptor
Definition io_uring_context.h:519
IoUringContext * parent
Definition io_uring_context.h:518
void is_sender
Definition io_uring_context.h:514
di::CompletionSignatures< di::SetValue(), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:516
friend auto tag_invoke(di::Tag< di::execution::connect >, ShutdownSender self, Receiver receiver)
Definition io_uring_context.h:566
net::Shutdown how
Definition io_uring_context.h:520
void did_complete(io_uring::CQE const *cqe) override
Definition io_uring_context.h:209
void execute() override
Definition io_uring_context.h:194
Type(IoUringContext *parent, int file_descriptor, di::Span< di::Byte const > buffer, di::Optional< u64 > offset, Rec receiver)
Definition io_uring_context.h:186
friend void tag_invoke(di::Tag< di::execution::start >, Type &self)
Definition io_uring_context.h:218
Definition io_uring_context.h:170
di::Span< di::Byte const > buffer
Definition io_uring_context.h:179
di::Optional< u64 > offset
Definition io_uring_context.h:180
int file_descriptor
Definition io_uring_context.h:178
void is_sender
Definition io_uring_context.h:172
friend auto tag_invoke(di::Tag< di::execution::connect >, WriteSomeSender self, Receiver receiver)
Definition io_uring_context.h:234
constexpr friend auto tag_invoke(di::Tag< di::execution::get_env >, WriteSomeSender const &self)
Definition io_uring_context.h:239
IoUringContext * parent
Definition io_uring_context.h:177
di::CompletionSignatures< di::SetValue(size_t), di::SetError(di::Error), di::SetStopped()> CompletionSignatures
Definition io_uring_context.h:174