Condy v1.6.0
C++ Asynchronous System Call Layer for Linux
Loading...
Searching...
No Matches
awaiter_operations.hpp
Go to the documentation of this file.
1
9
10#pragma once
11
12#include "condy/concepts.hpp"
13#include "condy/cqe_handler.hpp"
14#include "condy/ring.hpp"
16
17namespace condy {
18
29template <CQEHandlerLike CQEHandler, PrepFuncLike PrepFunc, typename... Args>
30auto build_op_awaiter(PrepFunc &&func, Args &&...handler_args) {
31 return build_op_sender<CQEHandler>(std::forward<PrepFunc>(func),
32 std::forward<Args>(handler_args)...);
33}
34
48template <CQEHandlerLike CQEHandler, PrepFuncLike PrepFunc,
49 typename MultiShotFunc, typename... Args>
50auto build_multishot_op_awaiter(PrepFunc &&func, MultiShotFunc &&multishot_func,
51 Args &&...handler_args) {
52 return build_multishot_op_sender<CQEHandler>(
53 std::forward<PrepFunc>(func),
54 std::forward<MultiShotFunc>(multishot_func),
55 std::forward<Args>(handler_args)...);
56}
57
70template <CQEHandlerLike CQEHandler, PrepFuncLike PrepFunc, typename FreeFunc,
71 typename... Args>
72auto build_zero_copy_op_awaiter(PrepFunc &&func, FreeFunc &&free_func,
73 Args &&...handler_args) {
74 return build_zero_copy_op_sender<CQEHandler>(
75 std::forward<PrepFunc>(func), std::forward<FreeFunc>(free_func),
76 std::forward<Args>(handler_args)...);
77}
78
79namespace detail {
80
81template <typename Func, typename... Args>
82auto make_op_awaiter(Func &&func, Args &&...args) {
83 auto prep_func = [func = std::forward<Func>(func),
84 ... args = std::forward<Args>(args)](Ring *ring) {
85 auto *sqe = ring->get_sqe();
86 func(sqe, args...);
87 return sqe;
88 };
89 return build_op_awaiter<SimpleCQEHandler>(std::move(prep_func));
90}
91
92#if !IO_URING_CHECK_VERSION(2, 13) // >= 2.13
93template <typename Func, typename... Args>
94auto make_op_awaiter128(Func &&func, Args &&...args) {
95 auto prep_func = [func = std::forward<Func>(func),
96 ... args = std::forward<Args>(args)](Ring *ring) {
97 auto *sqe = ring->get_sqe128();
98 if (!sqe) {
99 panic_on("SQE128 not enabled in the ring");
100 }
101 func(sqe, args...);
102 return sqe;
103 };
104 return build_op_awaiter<SimpleCQEHandler>(std::move(prep_func));
105}
106#endif
107
108template <typename MultiShotFunc, typename Func, typename... Args>
109auto make_multishot_op_awaiter(MultiShotFunc &&multishot_func, Func &&func,
110 Args &&...args) {
111 auto prep_func = [func = std::forward<Func>(func),
112 ... args = std::forward<Args>(args)](Ring *ring) {
113 auto *sqe = ring->get_sqe();
114 func(sqe, args...);
115 return sqe;
116 };
118 std::move(prep_func), std::forward<MultiShotFunc>(multishot_func));
119}
120
121template <BufferRingLike Br, typename Func, typename... Args>
122auto make_select_buffer_op_awaiter(Br *buffers, Func &&func, Args &&...args) {
123 auto prep_func = [bgid = buffers->bgid(), func = std::forward<Func>(func),
124 ... args = std::forward<Args>(args)](Ring *ring) {
125 auto *sqe = ring->get_sqe();
126 func(sqe, args...);
127 sqe->flags |= IOSQE_BUFFER_SELECT;
128 sqe->buf_group = bgid;
129 return sqe;
130 };
131 return build_op_awaiter<SelectBufferCQEHandler<Br>>(std::move(prep_func),
132 buffers);
133}
134
135template <typename MultiShotFunc, BufferRingLike Br, typename Func,
136 typename... Args>
137auto make_multishot_select_buffer_op_awaiter(MultiShotFunc &&multishot_func,
138 Br *buffers, Func &&func,
139 Args &&...args) {
140 auto prep_func = [bgid = buffers->bgid(), func = std::forward<Func>(func),
141 ... args = std::forward<Args>(args)](Ring *ring) {
142 auto *sqe = ring->get_sqe();
143 func(sqe, args...);
144 sqe->flags |= IOSQE_BUFFER_SELECT;
145 sqe->buf_group = bgid;
146 return sqe;
147 };
149 std::move(prep_func), std::forward<MultiShotFunc>(multishot_func),
150 buffers);
151}
152
153#if !IO_URING_CHECK_VERSION(2, 7) // >= 2.7
154template <BufferRingLike Br, typename Func, typename... Args>
155auto make_bundle_select_buffer_op_awaiter(Br *buffers, Func &&func,
156 Args &&...args) {
157 auto prep_func = [bgid = buffers->bgid(), func = std::forward<Func>(func),
158 ... args = std::forward<Args>(args)](Ring *ring) {
159 auto *sqe = ring->get_sqe();
160 func(sqe, args...);
161 sqe->flags |= IOSQE_BUFFER_SELECT;
162 sqe->buf_group = bgid;
163 sqe->ioprio |= IORING_RECVSEND_BUNDLE;
164 return sqe;
165 };
166 return build_op_awaiter<SelectBufferCQEHandler<Br>>(std::move(prep_func),
167 buffers);
168}
169#endif
170
171#if !IO_URING_CHECK_VERSION(2, 7) // >= 2.7
172template <typename MultiShotFunc, BufferRingLike Br, typename Func,
173 typename... Args>
174auto make_multishot_bundle_select_buffer_op_awaiter(
175 MultiShotFunc &&multishot_func, Br *buffers, Func &&func, Args &&...args) {
176 auto prep_func = [bgid = buffers->bgid(), func = std::forward<Func>(func),
177 ... args = std::forward<Args>(args)](Ring *ring) {
178 auto *sqe = ring->get_sqe();
179 func(sqe, args...);
180 sqe->flags |= IOSQE_BUFFER_SELECT;
181 sqe->buf_group = bgid;
182 sqe->ioprio |= IORING_RECVSEND_BUNDLE;
183 return sqe;
184 };
186 std::move(prep_func), std::forward<MultiShotFunc>(multishot_func),
187 buffers);
188}
189#endif
190
191template <typename FreeFunc, typename Func, typename... Args>
192auto make_zero_copy_op_awaiter(FreeFunc &&free_func, Func &&func,
193 Args &&...args) {
194 auto prep_func = [func = std::forward<Func>(func),
195 ... args = std::forward<Args>(args)](Ring *ring) {
196 auto *sqe = ring->get_sqe();
197 func(sqe, args...);
198 return sqe;
199 };
201 std::move(prep_func), std::forward<FreeFunc>(free_func));
202}
203
204} // namespace detail
205
206} // namespace condy
Definitions of CQE handlers.
The main namespace for the Condy library.
Definition condy.hpp:30
auto build_op_awaiter(PrepFunc &&func, Args &&...handler_args)
Build a single-shot operation awaiter with custom CQE handler.
auto build_zero_copy_op_awaiter(PrepFunc &&func, FreeFunc &&free_func, Args &&...handler_args)
Build a zero-copy operation awaiter with custom CQE handler.
auto build_multishot_op_awaiter(PrepFunc &&func, MultiShotFunc &&multishot_func, Args &&...handler_args)
Build a multi-shot operation awaiter with custom CQE handler.
Wrapper classes for liburing interfaces.
Helper functions for composing asynchronous operations.