#include <functional>
#include <queue>
-#include <stdint.h>
-#include <string>
+#include <stddef.h>
+#include <string_view>
+#include <sys/socket.h>
+#include <sys/types.h>
+
+struct io_uring_sqe;
#ifndef WITHOUT_URING
#include <liburing.h>
#endif
-#include <sys/socket.h>
class IOUringEngine {
public:
- IOUringEngine();
- void submit_read(int fd, size_t len, off_t offset, std::function<void(std::string)> cb);
+ IOUringEngine(size_t slop_bytes);
+ void submit_read(int fd, size_t len, off_t offset, std::function<void(std::string_view)> cb);
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<void(std::string)> cb);
+ void submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, std::function<void(std::string_view)> cb);
io_uring ring;
#endif
size_t pending_reads = 0; // Number of requests we have going in the ring.
bool using_uring;
+ const size_t slop_bytes;
struct QueuedRead {
int fd;
size_t len;
off_t offset;
- std::function<void(std::string)> cb;
+ std::function<void(std::string_view)> cb;
};
std::queue<QueuedRead> queued_reads;
struct PendingRead {
void *buf;
size_t len;
- std::function<void(std::string)> cb;
+ std::function<void(std::string_view)> cb;
// For re-submission.
int fd;