From 8845d406a45a0765c6ffb62705568b58a8e61756 Mon Sep 17 00:00:00 2001 From: koolkdev Date: Sat, 12 Aug 2017 20:16:25 +0300 Subject: [PATCH] wfs-fuse: Create the file stream on file opening (much faster reading) --- wfs-fuse/wfs-fuse.cpp | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/wfs-fuse/wfs-fuse.cpp b/wfs-fuse/wfs-fuse.cpp index 834319e..293e1a6 100644 --- a/wfs-fuse/wfs-fuse.cpp +++ b/wfs-fuse/wfs-fuse.cpp @@ -9,10 +9,16 @@ #include #include +#include #include static std::shared_ptr wfs; +struct locked_stream { + std::unique_ptr stream; + std::mutex lock; +}; + static int wfs_getattr(const char *path, struct stat *stbuf) { memset(stbuf, 0, sizeof(struct stat)); @@ -59,29 +65,38 @@ static int wfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, } static int wfs_open(const char *path, struct fuse_file_info *fi) { - if (!wfs->GetObject(path)) + auto item = wfs->GetObject(path); + if (!item->IsFile()) return -ENOENT; if ((fi->flags & O_ACCMODE) != O_RDONLY) return -EACCES; - return 0; + fi->fh = reinterpret_cast(new locked_stream { + std::unique_ptr(new File::stream(std::dynamic_pointer_cast(item))) + }); + + return 0; +} + +static int wfs_release(const char *path, struct fuse_file_info *fi) { + (void) path; + + delete reinterpret_cast(fi->fh); + return 0; } static int wfs_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { - (void) fi; - - auto item = wfs->GetObject(path); - if (!item || !item->IsFile()) - return -ENOENT; + (void) path; - File::stream stream(std::dynamic_pointer_cast(item)); + auto stream = reinterpret_cast(fi->fh); + std::lock_guard guard(stream->lock); - stream.seekg(offset, stream.beg); - stream.read(buf, size); + stream->stream->seekg(offset, stream->stream->beg); + stream->stream->read(buf, size); - return static_cast(stream.gcount()); + return static_cast(stream->stream->gcount()); } int wfs_readlink(const char *path, char *buf, size_t size) { @@ -225,6 +240,7 @@ int main(int argc, char *argv[]) { wfs_oper.getattr = wfs_getattr; wfs_oper.readdir = wfs_readdir; wfs_oper.open = wfs_open; + wfs_oper.release = wfs_release; wfs_oper.read = wfs_read; wfs_oper.readlink = wfs_readlink;