29template <CQEHandlerLike CQEHandler, PrepFuncLike PrepFunc,
typename... Args>
31 return build_op_sender<CQEHandler>(std::forward<PrepFunc>(func),
32 std::forward<Args>(handler_args)...);
48template <CQEHandlerLike CQEHandler, PrepFuncLike PrepFunc,
49 typename MultiShotFunc,
typename... Args>
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)...);
70template <CQEHandlerLike CQEHandler, PrepFuncLike PrepFunc,
typename FreeFunc,
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)...);
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();
92#if !IO_URING_CHECK_VERSION(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();
99 panic_on(
"SQE128 not enabled in the ring");
108template <
typename MultiShotFunc,
typename Func,
typename... Args>
109auto make_multishot_op_awaiter(MultiShotFunc &&multishot_func, Func &&func,
111 auto prep_func = [func = std::forward<Func>(func),
112 ... args = std::forward<Args>(args)](Ring *ring) {
113 auto *sqe = ring->get_sqe();
118 std::move(prep_func), std::forward<MultiShotFunc>(multishot_func));
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();
127 sqe->flags |= IOSQE_BUFFER_SELECT;
128 sqe->buf_group = bgid;
135template <
typename MultiShotFunc, BufferRingLike Br,
typename Func,
137auto make_multishot_select_buffer_op_awaiter(MultiShotFunc &&multishot_func,
138 Br *buffers, Func &&func,
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();
144 sqe->flags |= IOSQE_BUFFER_SELECT;
145 sqe->buf_group = bgid;
149 std::move(prep_func), std::forward<MultiShotFunc>(multishot_func),
153#if !IO_URING_CHECK_VERSION(2, 7)
154template <BufferRingLike Br,
typename Func,
typename... Args>
155auto make_bundle_select_buffer_op_awaiter(Br *buffers, Func &&func,
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();
161 sqe->flags |= IOSQE_BUFFER_SELECT;
162 sqe->buf_group = bgid;
163 sqe->ioprio |= IORING_RECVSEND_BUNDLE;
171#if !IO_URING_CHECK_VERSION(2, 7)
172template <
typename MultiShotFunc, BufferRingLike Br,
typename Func,
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();
180 sqe->flags |= IOSQE_BUFFER_SELECT;
181 sqe->buf_group = bgid;
182 sqe->ioprio |= IORING_RECVSEND_BUNDLE;
186 std::move(prep_func), std::forward<MultiShotFunc>(multishot_func),
191template <
typename FreeFunc,
typename Func,
typename... Args>
192auto make_zero_copy_op_awaiter(FreeFunc &&free_func, Func &&func,
194 auto prep_func = [func = std::forward<Func>(func),
195 ... args = std::forward<Args>(args)](Ring *ring) {
196 auto *sqe = ring->get_sqe();
201 std::move(prep_func), std::forward<FreeFunc>(free_func));
Definitions of CQE handlers.
The main namespace for the Condy library.
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.