From fdeb0208a38c0094a145b97da04af109cd5e32b1 Mon Sep 17 00:00:00 2001 From: wokron Date: Sat, 18 Apr 2026 13:37:37 +0800 Subject: [PATCH 1/5] simplify cqe_handler --- include/condy/concepts.hpp | 9 +---- include/condy/cqe_handler.hpp | 69 ++++++++------------------------ include/condy/finish_handles.hpp | 8 ++-- include/condy/senders.hpp | 6 +-- 4 files changed, 25 insertions(+), 67 deletions(-) diff --git a/include/condy/concepts.hpp b/include/condy/concepts.hpp index 258b716a..a658fe47 100644 --- a/include/condy/concepts.hpp +++ b/include/condy/concepts.hpp @@ -28,13 +28,8 @@ concept PrepFuncLike = requires(T prep_func, Ring *ring) { }; template -concept CQEHandlerLike = requires(T handler, io_uring_cqe *cqe) { - typename std::decay_t::ReturnType; - { handler.handle_cqe(cqe) } noexcept -> std::same_as; - { - handler.extract_result() - } noexcept -> std::same_as::ReturnType>; -}; +concept CQEHandlerLike = + requires(T handler, io_uring_cqe *cqe) { handler(cqe); }; template concept BufferRingLike = requires(T br, io_uring_cqe *cqe) { diff --git a/include/condy/cqe_handler.hpp b/include/condy/cqe_handler.hpp index 272f9127..3d21e9aa 100644 --- a/include/condy/cqe_handler.hpp +++ b/include/condy/cqe_handler.hpp @@ -2,9 +2,7 @@ * @file cqe_handler.hpp * @brief Definitions of CQE handlers * @details This file defines a series of CQE handlers, which are responsible - * for processing the completion of asynchronous operations. Each handler - * defines a `handle_cqe` method to process the CQE and an `extract_result` - * method to retrieve the result of the operation. + * for processing the completion of asynchronous operations. */ #pragma once @@ -45,16 +43,8 @@ inline bool check_cqe32([[maybe_unused]] io_uring_cqe *cqe) { * @return int32_t The result of the operation, which is the value of `cqe->res` * for the corresponding CQE. */ -class SimpleCQEHandler { -public: - using ReturnType = int32_t; - - void handle_cqe(io_uring_cqe *cqe) noexcept { res_ = cqe->res; } - - ReturnType extract_result() noexcept { return res_; } - -private: - int32_t res_ = -ENOTRECOVERABLE; // Internal error if not set +struct SimpleCQEHandler { + int32_t operator()(io_uring_cqe *cqe) noexcept { return cqe->res; } }; /** @@ -66,22 +56,14 @@ class SimpleCQEHandler { */ template class SelectBufferCQEHandler { public: - using ReturnType = std::pair; - SelectBufferCQEHandler(Br *buffers) : buffers_(buffers) {} - void handle_cqe(io_uring_cqe *cqe) noexcept { - res_ = cqe->res; - buffer_ = buffers_->handle_finish(cqe); + std::pair + operator()(io_uring_cqe *cqe) noexcept { + return {cqe->res, buffers_->handle_finish(cqe)}; } - ReturnType extract_result() noexcept { return {res_, std::move(buffer_)}; } - private: - using BufferType = typename Br::ReturnType; - - int32_t res_ = -ENOTRECOVERABLE; // Internal error if not set - BufferType buffer_ = {}; Br *buffers_; }; @@ -91,22 +73,12 @@ template class SelectBufferCQEHandler { * @return std::pair A pair containing the status and result * of the NVMe command. */ -class NVMePassthruCQEHandler { -public: - using ReturnType = std::pair; - - void handle_cqe(io_uring_cqe *cqe) noexcept { +struct NVMePassthruCQEHandler { + std::pair operator()(io_uring_cqe *cqe) noexcept { assert(detail::check_cqe32(cqe) && "Expected big CQE for NVMe passthrough"); - res_ = cqe->res; - nvme_result_ = cqe->big_cqe[0]; + return {cqe->res, cqe->big_cqe[0]}; } - - ReturnType extract_result() noexcept { return {res_, nvme_result_}; } - -private: - int32_t res_ = -ENOTRECOVERABLE; // Internal error if not set - uint64_t nvme_result_ = 0; }; #if !IO_URING_CHECK_VERSION(2, 12) // >= 2.12 @@ -138,25 +110,18 @@ struct TxTimestampResult { * @return std::pair Result of the TX timestamp * operation. */ -class TxTimestampCQEHandler { -public: - using ReturnType = std::pair; - - void handle_cqe(io_uring_cqe *cqe) noexcept { +struct TxTimestampCQEHandler { + std::pair + operator()(io_uring_cqe *cqe) noexcept { assert(detail::check_cqe32(cqe) && "Expected big CQE for TX timestamp operations"); - res_ = cqe->res; - result_.tstype = + TxTimestampResult result; + result.tstype = static_cast(cqe->flags >> IORING_TIMESTAMP_TYPE_SHIFT); - result_.hwts = cqe->flags & IORING_CQE_F_TSTAMP_HW; - result_.ts = *reinterpret_cast(cqe + 1); + result.hwts = cqe->flags & IORING_CQE_F_TSTAMP_HW; + result.ts = *reinterpret_cast(cqe + 1); + return {cqe->res, result}; } - - ReturnType extract_result() noexcept { return {res_, result_}; } - -private: - int32_t res_ = -ENOTRECOVERABLE; // Internal error if not set - TxTimestampResult result_; }; #endif diff --git a/include/condy/finish_handles.hpp b/include/condy/finish_handles.hpp index f64ec836..141dfbba 100644 --- a/include/condy/finish_handles.hpp +++ b/include/condy/finish_handles.hpp @@ -21,7 +21,7 @@ namespace condy { template class OpFinishHandle : public OpFinishHandleBase { public: - using ReturnType = typename CQEHandler::ReturnType; + using ReturnType = decltype(std::declval()(nullptr)); template OpFinishHandle(Receiver receiver, Args &&...args) @@ -64,8 +64,7 @@ class OpFinishHandle : public OpFinishHandleBase { protected: void finish_(io_uring_cqe *cqe) noexcept { stop_callback_.reset(); - cqe_handler_.handle_cqe(cqe); - std::move(receiver_)(cqe_handler_.extract_result()); + std::move(receiver_)(cqe_handler_(cqe)); } CQEHandler cqe_handler_; @@ -93,8 +92,7 @@ class MultiShotOpFinishHandle : public OpFinishHandle { bool handle_impl_(io_uring_cqe *cqe) noexcept /* fake override */ { if (cqe->flags & IORING_CQE_F_MORE) { - this->cqe_handler_.handle_cqe(cqe); - func_(this->cqe_handler_.extract_result()); + func_(this->cqe_handler_(cqe)); return false; } else { this->finish_(cqe); diff --git a/include/condy/senders.hpp b/include/condy/senders.hpp index 5858b40f..0cfb1478 100644 --- a/include/condy/senders.hpp +++ b/include/condy/senders.hpp @@ -20,7 +20,7 @@ template class OpSender { public: - using ReturnType = typename CQEHandler::ReturnType; + using ReturnType = decltype(std::declval()(nullptr)); OpSender(PrepFunc func, HandleArgs... args) : prep_func_(std::move(func)), handle_args_(std::move(args)...) {} @@ -45,7 +45,7 @@ template class MultiShotOpSender { public: - using ReturnType = typename CQEHandler::ReturnType; + using ReturnType = decltype(std::declval()(nullptr)); MultiShotOpSender(PrepFunc func, MultiShotFunc multi_shot_func, HandleArgs... args) @@ -77,7 +77,7 @@ template class ZeroCopyOpSender { public: - using ReturnType = typename CQEHandler::ReturnType; + using ReturnType = decltype(std::declval()(nullptr)); ZeroCopyOpSender(PrepFunc func, FreeFunc free_func, HandleArgs... args) : prep_func_(std::move(func)), free_func_(std::move(free_func)), From 8951b4a890be6a11767aa8fe505cd1ca823ea953 Mon Sep 17 00:00:00 2001 From: wokron Date: Sat, 18 Apr 2026 14:01:08 +0800 Subject: [PATCH 2/5] simplify OpSenderOperationState --- include/condy/op_states.hpp | 9 +++------ include/condy/senders.hpp | 16 +++++++--------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/include/condy/op_states.hpp b/include/condy/op_states.hpp index 514482e9..2e6530dc 100644 --- a/include/condy/op_states.hpp +++ b/include/condy/op_states.hpp @@ -19,15 +19,12 @@ namespace condy { namespace detail { -template -class OpSenderOperationState { +template class OpSenderOperationState { public: template - OpSenderOperationState(Func prep_func, Receiver receiver, - HandleArgs &&...handle_args) + OpSenderOperationState(Func prep_func, HandleArgs &&...handle_args) : prep_func_(std::move(prep_func)), - finish_handle_(std::move(receiver), - std::forward(handle_args)...) {} + finish_handle_(std::forward(handle_args)...) {} OpSenderOperationState(OpSenderOperationState &&) = delete; OpSenderOperationState &operator=(OpSenderOperationState &&) = delete; diff --git a/include/condy/senders.hpp b/include/condy/senders.hpp index 0cfb1478..644b88b0 100644 --- a/include/condy/senders.hpp +++ b/include/condy/senders.hpp @@ -29,7 +29,7 @@ class OpSender { return std::apply( [&](auto &&...args) { return detail::OpSenderOperationState< - OpFinishHandle, PrepFunc, Receiver>( + OpFinishHandle, PrepFunc>( prep_func_, std::move(receiver), std::forward(args)...); }, @@ -59,10 +59,9 @@ class MultiShotOpSender { return detail::OpSenderOperationState< MultiShotOpFinishHandle, - PrepFunc, Receiver>(std::move(prep_func_), - std::move(receiver), - std::move(multi_shot_func_), - std::forward(args)...); + PrepFunc>(std::move(prep_func_), std::move(receiver), + std::move(multi_shot_func_), + std::forward(args)...); }, std::move(handle_args_)); } @@ -88,10 +87,9 @@ class ZeroCopyOpSender { [&](auto &&...args) { return detail::OpSenderOperationState< ZeroCopyOpFinishHandle, - PrepFunc, Receiver>(std::move(prep_func_), - std::move(receiver), - std::move(free_func_), - std::forward(args)...); + PrepFunc>(std::move(prep_func_), std::move(receiver), + std::move(free_func_), + std::forward(args)...); }, std::move(handle_args_)); } From c616ddcc974d68ed6b84615309c671ebec93bc50 Mon Sep 17 00:00:00 2001 From: wokron Date: Sat, 18 Apr 2026 14:19:03 +0800 Subject: [PATCH 3/5] simplify tparams --- include/condy/finish_handles.hpp | 21 ++++----- include/condy/sender_operations.hpp | 19 ++++---- include/condy/senders.hpp | 73 +++++++++++------------------ tests/test_op_finish_handle.cpp | 14 +++--- tests/test_ring.cpp | 6 ++- 5 files changed, 58 insertions(+), 75 deletions(-) diff --git a/include/condy/finish_handles.hpp b/include/condy/finish_handles.hpp index 141dfbba..d7b5e8d4 100644 --- a/include/condy/finish_handles.hpp +++ b/include/condy/finish_handles.hpp @@ -23,10 +23,8 @@ class OpFinishHandle : public OpFinishHandleBase { public: using ReturnType = decltype(std::declval()(nullptr)); - template - OpFinishHandle(Receiver receiver, Args &&...args) - : cqe_handler_(std::forward(args)...), - receiver_(std::move(receiver)) { + OpFinishHandle(CQEHandler cqe_handler, Receiver receiver) + : cqe_handler_(std::move(cqe_handler)), receiver_(std::move(receiver)) { this->handle_func_ = handle_static_; } @@ -75,10 +73,10 @@ class OpFinishHandle : public OpFinishHandleBase { template class MultiShotOpFinishHandle : public OpFinishHandle { public: - template - MultiShotOpFinishHandle(Receiver receiver, Func func, Args &&...args) - : OpFinishHandle(std::move(receiver), - std::forward(args)...), + MultiShotOpFinishHandle(CQEHandler cqe_handler, Receiver receiver, + Func func) + : OpFinishHandle(std::move(cqe_handler), + std::move(receiver)), func_(std::move(func)) { this->handle_func_ = handle_static_; } @@ -107,10 +105,9 @@ class MultiShotOpFinishHandle : public OpFinishHandle { template class ZeroCopyOpFinishHandle : public OpFinishHandle { public: - template - ZeroCopyOpFinishHandle(Receiver receiver, Func func, Args &&...args) - : OpFinishHandle(std::move(receiver), - std::forward(args)...), + ZeroCopyOpFinishHandle(CQEHandler cqe_handler, Receiver receiver, Func func) + : OpFinishHandle(std::move(cqe_handler), + std::move(receiver)), free_func_(std::move(func)) { this->handle_func_ = handle_static_; } diff --git a/include/condy/sender_operations.hpp b/include/condy/sender_operations.hpp index 7b92ca36..77f63f0e 100644 --- a/include/condy/sender_operations.hpp +++ b/include/condy/sender_operations.hpp @@ -13,8 +13,9 @@ namespace condy { template auto build_op_sender(PrepFunc &&prep_func, Args &&...args) { - return OpSender, CQEHandler, std::decay_t...>( - std::forward(prep_func), std::forward(args)...); + return OpSender, CQEHandler>( + std::forward(prep_func), + CQEHandler(std::forward(args)...)); } template , CQEHandler, - std::decay_t, - std::decay_t...>( + std::decay_t>( std::forward(func), - std::forward(multishot_func), - std::forward(handler_args)...); + CQEHandler(std::forward(handler_args)...), + std::forward(multishot_func)); } template , CQEHandler, - std::decay_t, std::decay_t...>( - std::forward(func), std::forward(free_func), - std::forward(handler_args)...); + std::decay_t>( + std::forward(func), + CQEHandler(std::forward(handler_args)...), + std::forward(free_func)); } namespace detail { diff --git a/include/condy/senders.hpp b/include/condy/senders.hpp index 644b88b0..3caeae16 100644 --- a/include/condy/senders.hpp +++ b/include/condy/senders.hpp @@ -16,88 +16,69 @@ namespace condy { -template -class OpSender { +template class OpSender { public: using ReturnType = decltype(std::declval()(nullptr)); - OpSender(PrepFunc func, HandleArgs... args) - : prep_func_(std::move(func)), handle_args_(std::move(args)...) {} + OpSender(PrepFunc func, CQEHandler cqe_handler) + : prep_func_(std::move(func)), cqe_handler_(std::move(cqe_handler)) {} template auto connect(Receiver receiver) noexcept { - return std::apply( - [&](auto &&...args) { - return detail::OpSenderOperationState< - OpFinishHandle, PrepFunc>( - prep_func_, std::move(receiver), - std::forward(args)...); - }, - std::move(handle_args_)); + return detail::OpSenderOperationState< + OpFinishHandle, PrepFunc>( + std::move(prep_func_), std::move(cqe_handler_), + std::move(receiver)); } private: PrepFunc prep_func_; - std::tuple handle_args_; + CQEHandler cqe_handler_; }; template + typename MultiShotFunc> class MultiShotOpSender { public: using ReturnType = decltype(std::declval()(nullptr)); - MultiShotOpSender(PrepFunc func, MultiShotFunc multi_shot_func, - HandleArgs... args) - : prep_func_(std::move(func)), - multi_shot_func_(std::move(multi_shot_func)), - handle_args_(std::move(args)...) {} + MultiShotOpSender(PrepFunc func, CQEHandler cqe_handler, + MultiShotFunc multi_shot_func) + : prep_func_(std::move(func)), cqe_handler_(std::move(cqe_handler)), + multi_shot_func_(std::move(multi_shot_func)) {} template auto connect(Receiver receiver) noexcept { - return std::apply( - [&](auto &&...args) { - return detail::OpSenderOperationState< - MultiShotOpFinishHandle, - PrepFunc>(std::move(prep_func_), std::move(receiver), - std::move(multi_shot_func_), - std::forward(args)...); - }, - std::move(handle_args_)); + return detail::OpSenderOperationState< + MultiShotOpFinishHandle, + PrepFunc>(std::move(prep_func_), std::move(cqe_handler_), + std::move(receiver), std::move(multi_shot_func_)); } private: PrepFunc prep_func_; + CQEHandler cqe_handler_; MultiShotFunc multi_shot_func_; - std::tuple handle_args_; }; -template +template class ZeroCopyOpSender { public: using ReturnType = decltype(std::declval()(nullptr)); - ZeroCopyOpSender(PrepFunc func, FreeFunc free_func, HandleArgs... args) - : prep_func_(std::move(func)), free_func_(std::move(free_func)), - handle_args_(std::move(args)...) {} + ZeroCopyOpSender(PrepFunc func, CQEHandler cqe_handler, FreeFunc free_func) + : prep_func_(std::move(func)), cqe_handler_(std::move(cqe_handler)), + free_func_(std::move(free_func)) {} template auto connect(Receiver receiver) noexcept { - return std::apply( - [&](auto &&...args) { - return detail::OpSenderOperationState< - ZeroCopyOpFinishHandle, - PrepFunc>(std::move(prep_func_), std::move(receiver), - std::move(free_func_), - std::forward(args)...); - }, - std::move(handle_args_)); + return detail::OpSenderOperationState< + ZeroCopyOpFinishHandle, PrepFunc>( + std::move(prep_func_), std::move(cqe_handler_), std::move(receiver), + std::move(free_func_)); } private: PrepFunc prep_func_; + CQEHandler cqe_handler_; FreeFunc free_func_; - std::tuple handle_args_; }; template class FlaggedOpSender { diff --git a/tests/test_op_finish_handle.cpp b/tests/test_op_finish_handle.cpp index 7c2c7595..7045fcd1 100644 --- a/tests/test_op_finish_handle.cpp +++ b/tests/test_op_finish_handle.cpp @@ -51,7 +51,7 @@ TEST_CASE("test op_finish_handle - basic usage") { int r = 0; MockReceiver receiver{invoke_count, r}; condy::OpFinishHandle handle( - receiver); + condy::SimpleCQEHandler(), receiver); auto *sqe = ring.get_sqe(); io_uring_prep_nop(sqe); @@ -84,8 +84,8 @@ TEST_CASE("test op_finish_handle - concurrent ops") { int r = 0; MockReceiver receiver{invoke_count, r}; condy::OpFinishHandle handle1( - receiver), - handle2(receiver); + condy::SimpleCQEHandler(), receiver), + handle2(condy::SimpleCQEHandler(), receiver); auto *sqe1 = ring.get_sqe(); io_uring_prep_nop(sqe1); @@ -112,7 +112,7 @@ TEST_CASE("test op_finish_handle - multishot op") { condy::MultiShotOpFinishHandle - handle(receiver, func); + handle(condy::SimpleCQEHandler(), receiver, func); REQUIRE(invoke_count == 0); io_uring_cqe cqe{}; cqe.res = 42; @@ -139,8 +139,10 @@ TEST_CASE("test op_finish_handle - zero copy op") { int res = -1; auto func = [&](int r) { res = r; }; - auto *handle = new condy::ZeroCopyOpFinishHandle< - condy::SimpleCQEHandler, decltype(func), MockReceiver>(receiver, func); + auto *handle = + new condy::ZeroCopyOpFinishHandle( + condy::SimpleCQEHandler(), receiver, func); REQUIRE(invoke_count == 0); io_uring_cqe cqe{}; diff --git a/tests/test_ring.cpp b/tests/test_ring.cpp index a9dae754..eb50b8c4 100644 --- a/tests/test_ring.cpp +++ b/tests/test_ring.cpp @@ -45,7 +45,8 @@ TEST_CASE("test ring - register and complete ops") { constexpr size_t num_ops = 4; std::vector> handles; for (size_t i = 0; i < num_ops; i++) { - handles.push_back(std::make_unique(receiver)); + handles.push_back( + std::make_unique(condy::SimpleCQEHandler(), receiver)); auto &handle = handles.back(); auto *sqe = ring.get_sqe(); io_uring_prep_nop(sqe); @@ -88,7 +89,8 @@ TEST_CASE("test ring - cancel ops") { constexpr size_t num_ops = 8; std::vector> handles; for (size_t i = 0; i < num_ops; i++) { - handles.push_back(std::make_unique(receiver)); + handles.push_back( + std::make_unique(condy::SimpleCQEHandler(), receiver)); auto &handle = handles.back(); auto *sqe = ring.get_sqe(); if (i % 2 == 0) { From 2f99637e4bff90c84643ee69d8b6c50092cebb50 Mon Sep 17 00:00:00 2001 From: wokron Date: Sat, 18 Apr 2026 17:19:00 +0800 Subject: [PATCH 4/5] fix return type --- include/condy/concepts.hpp | 5 +++-- include/condy/finish_handles.hpp | 2 -- include/condy/senders.hpp | 7 ++++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/condy/concepts.hpp b/include/condy/concepts.hpp index a658fe47..ec5684bd 100644 --- a/include/condy/concepts.hpp +++ b/include/condy/concepts.hpp @@ -28,8 +28,9 @@ concept PrepFuncLike = requires(T prep_func, Ring *ring) { }; template -concept CQEHandlerLike = - requires(T handler, io_uring_cqe *cqe) { handler(cqe); }; +concept CQEHandlerLike = requires(T handler, io_uring_cqe *cqe) { + { handler(cqe) } noexcept; +}; template concept BufferRingLike = requires(T br, io_uring_cqe *cqe) { diff --git a/include/condy/finish_handles.hpp b/include/condy/finish_handles.hpp index d7b5e8d4..bb5cd3da 100644 --- a/include/condy/finish_handles.hpp +++ b/include/condy/finish_handles.hpp @@ -21,8 +21,6 @@ namespace condy { template class OpFinishHandle : public OpFinishHandleBase { public: - using ReturnType = decltype(std::declval()(nullptr)); - OpFinishHandle(CQEHandler cqe_handler, Receiver receiver) : cqe_handler_(std::move(cqe_handler)), receiver_(std::move(receiver)) { this->handle_func_ = handle_static_; diff --git a/include/condy/senders.hpp b/include/condy/senders.hpp index 3caeae16..c31d472c 100644 --- a/include/condy/senders.hpp +++ b/include/condy/senders.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -18,7 +19,7 @@ namespace condy { template class OpSender { public: - using ReturnType = decltype(std::declval()(nullptr)); + using ReturnType = std::invoke_result_t; OpSender(PrepFunc func, CQEHandler cqe_handler) : prep_func_(std::move(func)), cqe_handler_(std::move(cqe_handler)) {} @@ -39,7 +40,7 @@ template class MultiShotOpSender { public: - using ReturnType = decltype(std::declval()(nullptr)); + using ReturnType = std::invoke_result_t; MultiShotOpSender(PrepFunc func, CQEHandler cqe_handler, MultiShotFunc multi_shot_func) @@ -62,7 +63,7 @@ class MultiShotOpSender { template class ZeroCopyOpSender { public: - using ReturnType = decltype(std::declval()(nullptr)); + using ReturnType = std::invoke_result_t; ZeroCopyOpSender(PrepFunc func, CQEHandler cqe_handler, FreeFunc free_func) : prep_func_(std::move(func)), cqe_handler_(std::move(cqe_handler)), From 10885dc0a19d47b6dab01b4bd7970d51a530a44e Mon Sep 17 00:00:00 2001 From: wokron Date: Sat, 18 Apr 2026 17:43:12 +0800 Subject: [PATCH 5/5] remove useless ReturnType in BufferRingLike --- include/condy/concepts.hpp | 5 +---- include/condy/cqe_handler.hpp | 10 +++++----- include/condy/provided_buffers.hpp | 20 +++++++------------- tests/test_buffers.cpp | 4 ++-- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/include/condy/concepts.hpp b/include/condy/concepts.hpp index ec5684bd..c6b69c55 100644 --- a/include/condy/concepts.hpp +++ b/include/condy/concepts.hpp @@ -34,11 +34,8 @@ concept CQEHandlerLike = requires(T handler, io_uring_cqe *cqe) { template concept BufferRingLike = requires(T br, io_uring_cqe *cqe) { - typename std::decay_t::ReturnType; { br.bgid() } -> std::same_as; - { - br.handle_finish(cqe) - } -> std::same_as::ReturnType>; + { br.handle_finish(cqe) }; }; template diff --git a/include/condy/cqe_handler.hpp b/include/condy/cqe_handler.hpp index 3d21e9aa..188feb09 100644 --- a/include/condy/cqe_handler.hpp +++ b/include/condy/cqe_handler.hpp @@ -51,16 +51,16 @@ struct SimpleCQEHandler { * @brief A CQE handler that returns the selected buffers based on the result of * the CQE. * @tparam Br The buffer ring type - * @return std::pair A pair containing the - * result of the operation (the value of `cqe->res`) and the selected buffers. + * @return std::pair A pair containing the + * result of the operation (the value of `cqe->res`) and the selected buffer, + * whose type is determined by the buffer ring. */ template class SelectBufferCQEHandler { public: SelectBufferCQEHandler(Br *buffers) : buffers_(buffers) {} - std::pair - operator()(io_uring_cqe *cqe) noexcept { - return {cqe->res, buffers_->handle_finish(cqe)}; + auto operator()(io_uring_cqe *cqe) noexcept { + return std::make_pair(cqe->res, buffers_->handle_finish(cqe)); } private: diff --git a/include/condy/provided_buffers.hpp b/include/condy/provided_buffers.hpp index 37e1589b..fc047e7b 100644 --- a/include/condy/provided_buffers.hpp +++ b/include/condy/provided_buffers.hpp @@ -46,8 +46,6 @@ namespace detail { class BundledProvidedBufferQueue { public: - using ReturnType = BufferInfo; - BundledProvidedBufferQueue(uint32_t capacity, unsigned int flags) : capacity_(std::bit_ceil(capacity)), buf_lens_(capacity_, 0) { auto &context = detail::Context::current(); @@ -137,18 +135,18 @@ class BundledProvidedBufferQueue { public: uint16_t bgid() const noexcept { return bgid_; } - ReturnType handle_finish(io_uring_cqe *cqe) noexcept { + BufferInfo handle_finish(io_uring_cqe *cqe) noexcept { assert(cqe != nullptr); int32_t res = cqe->res; uint32_t flags = cqe->flags; if (!(flags & IORING_CQE_F_BUFFER)) { - return ReturnType{0, 0}; + return BufferInfo{0, 0}; } assert(res > 0); - ReturnType result = { + BufferInfo result = { .bid = static_cast(flags >> IORING_CQE_BUFFER_SHIFT), .num_buffers = 0, }; @@ -209,7 +207,7 @@ class ProvidedBufferQueue : public detail::BundledProvidedBufferQueue { ProvidedBufferQueue(uint32_t capacity, unsigned int flags = 0) : BundledProvidedBufferQueue(capacity, flags) {} - ReturnType handle_finish(io_uring_cqe *cqe) noexcept { + BufferInfo handle_finish(io_uring_cqe *cqe) noexcept { assert(cqe != nullptr); auto result = BundledProvidedBufferQueue::handle_finish(cqe); assert(result.num_buffers <= 1); @@ -285,8 +283,6 @@ namespace detail { class BundledProvidedBufferPool { public: - using ReturnType = std::vector; - BundledProvidedBufferPool(uint32_t num_buffers, size_t buffer_size, unsigned int flags) : num_buffers_(std::bit_ceil(num_buffers)), buffer_size_(buffer_size) { @@ -361,7 +357,7 @@ class BundledProvidedBufferPool { public: uint16_t bgid() const noexcept { return bgid_; } - ReturnType handle_finish(io_uring_cqe *cqe) noexcept { + std::vector handle_finish(io_uring_cqe *cqe) noexcept { assert(cqe != nullptr); int32_t res = cqe->res; uint32_t flags = cqe->flags; @@ -464,8 +460,6 @@ inline void ProvidedBuffer::reset() noexcept { */ class ProvidedBufferPool : public detail::BundledProvidedBufferPool { public: - using ReturnType = ProvidedBuffer; - /** * @brief Construct a new ProvidedBufferPool object in current Runtime. * @param num_buffers Number of buffers to allocate in the pool. @@ -478,11 +472,11 @@ class ProvidedBufferPool : public detail::BundledProvidedBufferPool { : BundledProvidedBufferPool(num_buffers, buffer_size, flags) {} public: - ReturnType handle_finish(io_uring_cqe *cqe) noexcept { + ProvidedBuffer handle_finish(io_uring_cqe *cqe) noexcept { assert(cqe != nullptr); auto buffers = BundledProvidedBufferPool::handle_finish(cqe); if (buffers.empty()) { - return ReturnType(); + return ProvidedBuffer(); } assert(buffers.size() == 1); return std::move(buffers[0]); diff --git a/tests/test_buffers.cpp b/tests/test_buffers.cpp index 9c5b8f4d..be046426 100644 --- a/tests/test_buffers.cpp +++ b/tests/test_buffers.cpp @@ -141,7 +141,7 @@ TEST_CASE("test buffers - provided buffer queue usage") { r = -1; - condy::ProvidedBufferQueue::ReturnType ret; + condy::BufferInfo ret; size_t reaped = 0; while (reaped < 1) { @@ -349,7 +349,7 @@ TEST_CASE("test buffers - provided buffer pool usage") { r = -1; - condy::ProvidedBufferPool::ReturnType ret; + condy::ProvidedBuffer ret; size_t reaped = 0; while (reaped < 1) {