1 #ifndef IO_URING_ENGINE_H
2 #define IO_URING_ENGINE_H 1
8 #include <sys/socket.h>
18 IOUringEngine(size_t slop_bytes);
19 void submit_read(int fd, size_t len, off_t offset, std::function<void(std::string_view)> cb);
21 // NOTE: We just do the stat() to get the data into the dentry cache for fast access;
22 // we don't care about the return value. Thus, the callback has no parameter lists.
23 // If we have no io_uring, the callback will be made immediately, with no stat() call
25 void submit_stat(const char *path, std::function<void()> cb);
26 bool get_supports_stat() { return supports_stat; }
29 size_t get_waiting_reads() const { return pending_reads + queued_reads.size(); }
33 void submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, std::function<void(std::string_view)> cb);
34 void submit_stat_internal(io_uring_sqe *sqe, char *path, std::function<void()> cb);
38 size_t pending_reads = 0; // Number of requests we have going in the ring.
39 bool using_uring, supports_stat = false;
40 const size_t slop_bytes;
46 std::function<void(std::string_view)> cb;
48 std::queue<QueuedRead> queued_reads;
51 char *pathname; // Owned by us.
52 std::function<void()> cb;
54 std::queue<QueuedStat> queued_stats;
62 std::function<void(std::string_view)> read_cb;
63 std::function<void()> stat_cb;
82 // 256 simultaneous requests should be ample, for slow and fast media alike.
83 static constexpr size_t queue_depth = 256;
86 #endif // !defined(IO_URING_ENGINE_H)