36 std::size_t max_bytes = 1U << 20U) noexcept {
39#if defined(VELOGRAPHX_ENABLE_IO_URING) && defined(__linux__) && __has_include(<liburing.h>)
41 const int fd = ::open(path.c_str(), O_RDONLY | O_CLOEXEC);
48 if (::fstat(fd, &st) != 0 || st.st_size <= 0) {
54 const auto bytes =
static_cast<std::size_t
>(st.st_size) < max_bytes
55 ?
static_cast<std::size_t
>(st.st_size)
58 std::vector<std::uint8_t> buffer(bytes);
61 int rc = io_uring_queue_init(2, &ring, 0);
68 io_uring_sqe* sqe = io_uring_get_sqe(&ring);
71 io_uring_queue_exit(&ring);
76 io_uring_prep_read(sqe, fd, buffer.data(),
static_cast<unsigned>(buffer.size()), 0);
77 rc = io_uring_submit(&ring);
80 io_uring_queue_exit(&ring);
85 io_uring_cqe* cqe =
nullptr;
86 rc = io_uring_wait_cqe(&ring, &cqe);
89 }
else if (cqe->res < 0) {
91 io_uring_cqe_seen(&ring, cqe);
94 io_uring_cqe_seen(&ring, cqe);
97 io_uring_queue_exit(&ring);