22class ThreadLocalRing :
public ThreadLocalSingleton<ThreadLocalRing> {
24 Ring *ring() {
return &ring_; }
26 ThreadLocalRing() : ring_(create_ring_()) {}
30 static Ring create_ring_() noexcept {
31 io_uring_params params = {};
32 params.flags |= IORING_SETUP_CLAMP;
33 params.flags |= IORING_SETUP_SINGLE_ISSUER;
34 params.flags |= IORING_SETUP_SUBMIT_ALL;
37 return Ring(8, ¶ms,
nullptr, 0, std::numeric_limits<size_t>::max());
44inline int sync_msg_ring(io_uring_sqe *sqe_data)
noexcept {
45#if !IO_URING_CHECK_VERSION(2, 12)
46 return io_uring_register_sync_msg(sqe_data);
48 auto *ring = ThreadLocalRing::current().ring();
49 auto *sqe = ring->get_sqe();
53 ring->reap_completions_wait([&](io_uring_cqe *cqe) { r = cqe->res; });
55 return static_cast<int>(n);
64 CancelRequest(uintptr_t data) : data_(data) {}
66 void wait() noexcept {
67 while (!finished_.load(std::memory_order_acquire)) {
68 finished_.wait(
false, std::memory_order_relaxed);
72 void notify() noexcept {
73 finished_.store(
true, std::memory_order_release);
74 finished_.notify_one();
77 uintptr_t data() const noexcept {
return data_; }
81 std::atomic_bool finished_ =
false;
84class OpFinishHandleBase {
86 using HandleFunc = bool (*)(
void *, io_uring_cqe *)
noexcept;
88 bool handle(io_uring_cqe *cqe)
noexcept {
89 assert(handle_func_ !=
nullptr);
90 return handle_func_(
this, cqe);
94 OpFinishHandleBase() =
default;
97 HandleFunc handle_func_ =
nullptr;
The main namespace for the Condy library.
Wrapper classes for liburing interfaces.