]> git.sesse.net Git - plocate/commitdiff
Send the result value of the stat to the callback.
authorSteinar H. Gunderson <steinar+git@gunderson.no>
Tue, 27 Jul 2021 13:45:27 +0000 (15:45 +0200)
committerSteinar H. Gunderson <steinar+git@gunderson.no>
Tue, 27 Jul 2021 13:45:27 +0000 (15:45 +0200)
access_rx_cache.cpp
io_uring_engine.cpp
io_uring_engine.h

index b6db4eaf101c9faa288e3d0ac005b946c1a68e15..7633c3112530ff67fc52b8305ae67ff3d6b8ea0e 100644 (file)
@@ -55,7 +55,7 @@ void AccessRXCache::check_access(const char *filename, bool allow_async, functio
                        it->second.emplace_back(PendingStat{ filename, move(cb) });
                } else {
                        it = pending_stats.emplace(filename, vector<PendingStat>{}).first;
-                       engine->submit_stat(filename, [this, it, filename{ strdup(filename) }, cb{ move(cb) }] {
+                       engine->submit_stat(filename, [this, it, filename{ strdup(filename) }, cb{ move(cb) }](bool) {
                                // The stat returned, so now do the actual access() calls.
                                // All of them should be in cache, so don't fire off new statx()
                                // calls during that check.
index ab9f411c7774ad7905bfbde901459540ee3c4a23..116cf85f285ab15b1a85a6a39f59741271422e06 100644 (file)
@@ -46,7 +46,7 @@ IOUringEngine::IOUringEngine(size_t slop_bytes)
 #endif
 }
 
-void IOUringEngine::submit_stat(const char *path, std::function<void()> cb)
+void IOUringEngine::submit_stat(const char *path, std::function<void(bool)> cb)
 {
        assert(supports_stat);
 
@@ -115,7 +115,7 @@ void IOUringEngine::submit_read_internal(io_uring_sqe *sqe, int fd, size_t len,
        ++pending_reads;
 }
 
-void IOUringEngine::submit_stat_internal(io_uring_sqe *sqe, char *path, std::function<void()> cb)
+void IOUringEngine::submit_stat_internal(io_uring_sqe *sqe, char *path, std::function<void(bool)> cb)
 {
        PendingRead *pending = new PendingRead;
        pending->op = OP_STAT;
@@ -166,7 +166,7 @@ void IOUringEngine::finish()
                                --pending_reads;
 
                                size_t old_pending_reads = pending_reads;
-                               pending->stat_cb();
+                               pending->stat_cb(cqe->res == 0);
                                free(pending->stat.pathname);
                                delete pending->stat.buf;
                                delete pending;
index 470bacf9f4c450cb49d9a25185e8100eb4b073b3..688a6ae9a6b9b2da7c37c166f1aa5d51bed7c8dd 100644 (file)
@@ -18,11 +18,9 @@ public:
        IOUringEngine(size_t slop_bytes);
        void submit_read(int fd, size_t len, off_t offset, std::function<void(std::string_view)> cb);
 
-       // NOTE: We just do the stat() to get the data into the dentry cache for fast access;
-       // we don't care about the return value. Thus, the callback has no parameter lists.
-       // If we have no io_uring, the callback will be made immediately, with no stat() call
-       // being done.
-       void submit_stat(const char *path, std::function<void()> 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<void(bool ok)> cb);
        bool get_supports_stat() { return supports_stat; }
 
        void finish();
@@ -31,7 +29,7 @@ public:
 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_view)> cb);
-       void submit_stat_internal(io_uring_sqe *sqe, char *path, std::function<void()> cb);
+       void submit_stat_internal(io_uring_sqe *sqe, char *path, std::function<void(bool)> cb);
 
        io_uring ring;
 #endif
@@ -49,7 +47,7 @@ private:
 
        struct QueuedStat {
                char *pathname;  // Owned by us.
-               std::function<void()> cb;
+               std::function<void(bool)> cb;
        };
        std::queue<QueuedStat> queued_stats;
 
@@ -60,7 +58,7 @@ private:
                Op op;
 
                std::function<void(std::string_view)> read_cb;
-               std::function<void()> stat_cb;
+               std::function<void(bool)> stat_cb;
 
                union {
                        struct {