]> git.sesse.net Git - plocate/blobdiff - io_uring_engine.cpp
Disallow limit <= 0.
[plocate] / io_uring_engine.cpp
index f8295aacfde48f99e929a4dc2e0656b4f80dcd19..fc51abab6a75e23143235f555e8edec82547529b 100644 (file)
@@ -1,3 +1,6 @@
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #ifndef WITHOUT_URING
 #include <liburing.h>
@@ -5,13 +8,15 @@
 #include "io_uring_engine.h"
 
 #include <functional>
-#include <memory>
-#include <stdint.h>
+#include <iosfwd>
+#include <string>
 #include <unistd.h>
+#include <utility>
 
 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<void(string)> cb)
+void IOUringEngine::submit_read(int fd, size_t len, off_t offset, function<void(string_view)> 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<void(
 }
 
 #ifndef WITHOUT_URING
-void IOUringEngine::submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, function<void(string)> cb)
+void IOUringEngine::submit_read_internal(io_uring_sqe *sqe, int fd, size_t len, off_t offset, function<void(string_view)> 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<PendingRead *>(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<char *>(pending->buf), pending->len));
+                               pending->cb(string_view(reinterpret_cast<char *>(pending->buf), pending->len));
                                free(pending->buf);
                                delete pending;