22template <CQEHandlerLike CQEHandler,
typename Receiver>
23class OpFinishHandle :
public OpFinishHandleBase {
25 OpFinishHandle(CQEHandler cqe_handler, Receiver receiver)
26 : cqe_handler_(std::move(cqe_handler)), receiver_(std::move(receiver)) {
27 this->handle_func_ = handle_static_;
30 OpFinishHandle(
const OpFinishHandle &) =
delete;
31 OpFinishHandle &operator=(
const OpFinishHandle &) =
delete;
32 OpFinishHandle(OpFinishHandle &&) =
delete;
33 OpFinishHandle &operator=(OpFinishHandle &&) =
delete;
36 void maybe_set_cancel(Runtime *runtime)
noexcept {
37 auto stop_token = receiver_.get_stop_token();
38 if (stop_token.stop_possible()) {
39 stop_callback_.emplace(std::move(stop_token),
40 Cancellation{
this, runtime});
45 static bool handle_static_(
void *data, io_uring_cqe *cqe)
noexcept {
46 auto *self =
static_cast<OpFinishHandle *
>(data);
47 return self->handle_impl_(cqe);
50 bool handle_impl_(io_uring_cqe *cqe)
noexcept {
58 void operator()() noexcept {
59 runtime->cancel(encode_work(self, WorkType::Common));
63 using StopCallbackType =
64 stop_callback_t<stop_token_t<Receiver>, Cancellation>;
67 void finish_(io_uring_cqe *cqe)
noexcept {
68 stop_callback_.reset();
69 std::move(receiver_)(cqe_handler_(cqe));
72 CQEHandler cqe_handler_;
74 std::optional<StopCallbackType> stop_callback_;
77template <CQEHandlerLike CQEHandler,
typename Func,
typename Receiver>
78class MultiShotOpFinishHandle :
public OpFinishHandle<CQEHandler, Receiver> {
80 MultiShotOpFinishHandle(CQEHandler cqe_handler, Receiver receiver,
82 : OpFinishHandle<CQEHandler, Receiver>(std::move(cqe_handler),
84 func_(std::move(func)) {
85 this->handle_func_ = handle_static_;
89 static bool handle_static_(
void *data, io_uring_cqe *cqe)
noexcept {
90 auto *self =
static_cast<MultiShotOpFinishHandle *
>(data);
91 return self->handle_impl_(cqe);
94 bool handle_impl_(io_uring_cqe *cqe)
noexcept
96 if (cqe->flags & IORING_CQE_F_MORE) {
97 func_(this->cqe_handler_(cqe));
109template <CQEHandlerLike CQEHandler,
typename Func,
typename Receiver>
110class ZeroCopyOpFinishHandle :
public OpFinishHandle<CQEHandler, Receiver> {
112 ZeroCopyOpFinishHandle(CQEHandler cqe_handler, Receiver receiver, Func func)
113 : OpFinishHandle<CQEHandler, Receiver>(std::move(cqe_handler),
114 std::move(receiver)),
115 free_func_(std::move(func)) {
116 this->handle_func_ = handle_static_;
120 static bool handle_static_(
void *data, io_uring_cqe *cqe)
noexcept {
121 auto *self =
static_cast<ZeroCopyOpFinishHandle *
>(data);
122 return self->handle_impl_(cqe);
125 bool handle_impl_(io_uring_cqe *cqe)
noexcept
127 if (cqe->flags & IORING_CQE_F_MORE) {
131 if (cqe->flags & IORING_CQE_F_NOTIF) {
145 void notify_(int32_t res)
noexcept {
154template <
typename Handle>
class HandleBox {
156 template <
typename... Args>
157 HandleBox(Args &&...args) : handle_(std::forward<Args>(args)...) {}
159 HandleBox(
const HandleBox &) =
delete;
160 HandleBox &operator=(
const HandleBox &) =
delete;
161 HandleBox(HandleBox &&) =
delete;
162 HandleBox &operator=(HandleBox &&) =
delete;
165 Handle &get() noexcept {
return handle_; }
171template <CQEHandlerLike CQEHandler,
typename Func,
typename Receiver>
172class HandleBox<ZeroCopyOpFinishHandle<CQEHandler, Func, Receiver>> {
174 using Handle = ZeroCopyOpFinishHandle<CQEHandler, Func, Receiver>;
176 template <
typename... Args>
177 HandleBox(Args &&...args)
178 : handle_ptr_(new Handle(std::forward<Args>(args)...)) {}
180 HandleBox(
const HandleBox &) =
delete;
181 HandleBox &operator=(
const HandleBox &) =
delete;
182 HandleBox(HandleBox &&) =
delete;
183 HandleBox &operator=(HandleBox &&) =
delete;
186 Handle &get() noexcept {
return *handle_ptr_; }
The main namespace for the Condy library.
Runtime type for running the io_uring event loop.