| 110 | struct __context_base : STDEXEC::__immovable |
| 111 | { |
| 112 | explicit __context_base(unsigned __entries, unsigned __flags = 0) |
| 113 | : __params_{__context_base::__init_params(__flags)} |
| 114 | , __ring_fd_{__io_uring_setup(__entries, __params_)} |
| 115 | , __eventfd_{::eventfd(0, EFD_CLOEXEC)} |
| 116 | { |
| 117 | __throw_error_code_if(!__eventfd_, errno); |
| 118 | auto __sring_sz = __params_.sq_off.array + __params_.sq_entries * sizeof(unsigned); |
| 119 | auto __cring_sz = __params_.cq_off.cqes + __params_.cq_entries * sizeof(::io_uring_cqe); |
| 120 | auto __sqes_sz = __params_.sq_entries * sizeof(::io_uring_sqe); |
| 121 | if (__params_.features & IORING_FEAT_SINGLE_MMAP) |
| 122 | { |
| 123 | __sring_sz = STDEXEC::__umax({__sring_sz, __cring_sz}); |
| 124 | __cring_sz = __sring_sz; |
| 125 | } |
| 126 | __submission_queue_region_ = __map_region(__ring_fd_, IORING_OFF_SQ_RING, __sring_sz); |
| 127 | __submission_queue_entries_ = __map_region(__ring_fd_, IORING_OFF_SQES, __sqes_sz); |
| 128 | if (!(__params_.features & IORING_FEAT_SINGLE_MMAP)) |
| 129 | { |
| 130 | __completion_queue_region_ = __map_region(__ring_fd_, IORING_OFF_CQ_RING, __cring_sz); |
| 131 | } |
| 132 | } |
| 133 | |
| 134 | static auto __init_params(unsigned __flags) noexcept -> ::io_uring_params |
| 135 | { |
nothing calls this directly
no test coverage detected