X-Git-Url: https://git.sesse.net/?p=plocate;a=blobdiff_plain;f=io_uring_engine.h;h=bcb10581cd84c716c0d109d3f266446d141167e5;hp=c165a40f51df19f2054ff6210d526e52c2e3e3fb;hb=HEAD;hpb=2fcf8490a3a7a2e1d434f33383b5d33a0bc3ac03 diff --git a/io_uring_engine.h b/io_uring_engine.h index c165a40..bcb1058 100644 --- a/io_uring_engine.h +++ b/io_uring_engine.h @@ -7,6 +7,7 @@ #include #include #include +#include struct io_uring_sqe; #ifndef WITHOUT_URING @@ -17,17 +18,24 @@ class IOUringEngine { public: IOUringEngine(size_t slop_bytes); void submit_read(int fd, size_t len, off_t offset, std::function cb); + + // NOTE: We just do the stat() to get the data into the dentry cache for fast access, + // or to check whether the file exists. Thus, the callback has only an OK/not OK boolean. + void submit_stat(const char *path, std::function cb); + bool get_supports_stat() { return supports_stat; } + void finish(); size_t get_waiting_reads() const { return pending_reads + queued_reads.size(); } private: #ifndef WITHOUT_URING void submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, std::function cb); + void submit_stat_internal(io_uring_sqe *sqe, char *path, std::function cb); io_uring ring; #endif size_t pending_reads = 0; // Number of requests we have going in the ring. - bool using_uring; + bool using_uring, supports_stat = false; const size_t slop_bytes; struct QueuedRead { @@ -38,23 +46,40 @@ private: }; std::queue queued_reads; + struct QueuedStat { + char *pathname; // Owned by us. + std::function cb; + }; + std::queue queued_stats; + + enum Op { OP_READ, + OP_STAT }; + struct PendingRead { - void *buf; - size_t len; - std::function cb; + Op op; - // For re-submission. - int fd; - off_t offset; - iovec iov; + std::function read_cb; + std::function stat_cb; + + union { + struct { + void *buf; + size_t len; + + // For re-submission. + int fd; + off_t offset; + iovec iov; + } read; + struct { + char *pathname; + struct statx *buf; + } stat; + }; }; // 256 simultaneous requests should be ample, for slow and fast media alike. static constexpr size_t queue_depth = 256; }; -// A wrapper around pread() that returns an incomplete read. -// Always synchronous (no io_uring). -void complete_pread(int fd, void *ptr, size_t len, off_t offset); - #endif // !defined(IO_URING_ENGINE_H)