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) {
 
 
 
  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 };
 
 
  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) {
 
 
 
  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); }
 
 
  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:67
 
OpenMode
Definition sync_file.h:111
 
@ Readonly
Definition sync_file.h:111
 
@ WriteNew
Definition sync_file.h:111
 
@ AppendOnly
Definition sync_file.h:111
 
@ ReadWrite
Definition sync_file.h:111
 
@ WriteClobber
Definition sync_file.h:111
 
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