Condy v1.9
C++ Asynchronous System Call Layer for Linux
Loading...
Searching...
No Matches
cqe_handler.hpp
Go to the documentation of this file.
1
7
8#pragma once
9
10#include "condy/concepts.hpp"
12#include "condy/runtime.hpp"
13#include <cassert>
14#include <cerrno>
15#include <cstdint>
16#include <utility>
17
18namespace condy {
19
27 int32_t operator()(io_uring_cqe *cqe) noexcept { return cqe->res; }
28};
29
38template <typename Br>
39 requires(requires(Br *br, io_uring_cqe *cqe) { br->handle_finish(cqe); })
40class SelectBufferCQEHandler {
41public:
42 SelectBufferCQEHandler(Br *buffers) : buffers_(buffers) {}
43
44 auto operator()(io_uring_cqe *cqe) noexcept {
45 return std::make_pair(cqe->res, buffers_->handle_finish(cqe));
46 }
47
48private:
49 Br *buffers_;
50};
51
59 std::pair<int32_t, uint64_t> operator()(io_uring_cqe *cqe) noexcept {
60 assert(
61 detail::Context::current().runtime()->ring_internal().check_cqe32(
62 cqe) &&
63 "Expected big CQE for NVMe passthrough");
64 return {cqe->res, cqe->big_cqe[0]};
65 }
66};
67
75 uint64_t res2;
76
78 uint8_t device_status() noexcept { return res2 & 0xff; }
79
81 uint8_t driver_status() noexcept { return (res2 >> 8) & 0xff; }
82
84 uint8_t host_status() noexcept { return (res2 >> 16) & 0xff; }
85
87 uint8_t sense_len() noexcept { return (res2 >> 24) & 0xff; }
88
90 uint32_t resid_len() noexcept { return res2 >> 32; }
91};
92
100 std::pair<int32_t, SCSIBsgResult> operator()(io_uring_cqe *cqe) noexcept {
101 assert(
102 detail::Context::current().runtime()->ring_internal().check_cqe32(
103 cqe) &&
104 "Expected big CQE for SCSI BSG passthrough");
105 return {cqe->res, SCSIBsgResult{cqe->big_cqe[0]}};
106 }
107};
108
109#if CONDY_URING_VERSION_GE(2, 12) // >= 2.12
114struct TxTimestampResult {
119 int tstype; // cqe->flags >> IORING_TIMESTAMP_TYPE_SHIFT
120
124 bool hwts; // cqe->flags & IORING_CQE_F_TSTAMP_HW
125
129 io_timespec ts; // *(io_timespec *)(cqe->big_cqe)
130};
131
138struct TxTimestampCQEHandler {
139 std::pair<int32_t, TxTimestampResult>
140 operator()(io_uring_cqe *cqe) noexcept {
141 assert(
142 detail::Context::current().runtime()->ring_internal().check_cqe32(
143 cqe) &&
144 "Expected big CQE for TX timestamp operations");
145 TxTimestampResult result;
146 result.tstype =
147 static_cast<int>(cqe->flags >> IORING_TIMESTAMP_TYPE_SHIFT);
148 result.hwts = cqe->flags & IORING_CQE_F_TSTAMP_HW;
149 result.ts = reinterpret_cast<io_timespec &>(cqe->big_cqe);
150 return {cqe->res, result};
151 }
152};
153#endif
154
155} // namespace condy
The main namespace for the Condy library.
Definition condy.hpp:37
Runtime type for running the io_uring event loop.
A CQE handler for NVMe passthrough commands that extracts the status and result from the CQE.
A CQE handler for SCSI BSG passthrough commands that extracts the SCSI status and result from the CQE...
Result for SCSI BSG passthrough commands.
uint8_t host_status() noexcept
Extract host status.
uint8_t driver_status() noexcept
Extract driver status.
uint8_t device_status() noexcept
Extract SCSI device status byte.
uint8_t sense_len() noexcept
Extract sense data length.
uint64_t res2
Raw res2 from the CQE.
uint32_t resid_len() noexcept
Extract residual transfer length.
A simple CQE handler that extracts the result from the CQE without any additional processing.