X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=io_uring_engine.cpp;h=fc51abab6a75e23143235f555e8edec82547529b;hb=8c40d71acb262d9efe84af89e28a448bddadbabe;hp=f8295aacfde48f99e929a4dc2e0656b4f80dcd19;hpb=e3b55e4779a980c277d5c8225856cc6943bc0869;p=plocate diff --git a/io_uring_engine.cpp b/io_uring_engine.cpp index f8295aa..fc51aba 100644 --- a/io_uring_engine.cpp +++ b/io_uring_engine.cpp @@ -1,3 +1,6 @@ +#include +#include +#include #include #ifndef WITHOUT_URING #include @@ -5,13 +8,15 @@ #include "io_uring_engine.h" #include -#include -#include +#include +#include #include +#include using namespace std; -IOUringEngine::IOUringEngine() +IOUringEngine::IOUringEngine(size_t slop_bytes) + : slop_bytes(slop_bytes) { #ifdef WITHOUT_URING int ret = -1; @@ -21,14 +26,14 @@ IOUringEngine::IOUringEngine() using_uring = (ret >= 0); } -void IOUringEngine::submit_read(int fd, size_t len, off_t offset, function cb) +void IOUringEngine::submit_read(int fd, size_t len, off_t offset, function cb) { if (!using_uring) { // Synchronous read. string s; - s.resize(len); + s.resize(len + slop_bytes); complete_pread(fd, &s[0], len, offset); - cb(move(s)); + cb(string_view(s.data(), len)); return; } @@ -47,10 +52,10 @@ void IOUringEngine::submit_read(int fd, size_t len, off_t offset, function cb) +void IOUringEngine::submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, function cb) { void *buf; - if (posix_memalign(&buf, /*alignment=*/4096, len)) { + if (posix_memalign(&buf, /*alignment=*/4096, len + slop_bytes)) { fprintf(stderr, "Couldn't allocate %zu bytes: %s\n", len, strerror(errno)); exit(1); } @@ -91,7 +96,8 @@ void IOUringEngine::finish() } unsigned head; - io_uring_for_each_cqe(&ring, head, cqe) { + io_uring_for_each_cqe(&ring, head, cqe) + { PendingRead *pending = reinterpret_cast(cqe->user_data); if (cqe->res <= 0) { fprintf(stderr, "async read failed: %s\n", strerror(-cqe->res)); @@ -118,7 +124,7 @@ void IOUringEngine::finish() --pending_reads; size_t old_pending_reads = pending_reads; - pending->cb(string(reinterpret_cast(pending->buf), pending->len)); + pending->cb(string_view(reinterpret_cast(pending->buf), pending->len)); free(pending->buf); delete pending;