From f0caf372067d4c9b235deab1894a5940d8aa10e1 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Fri, 27 Oct 2017 01:28:33 +0100 Subject: Single [template] implementation of proxy wrapper maps for open files and directories --- netfs/fuse/fuseApp.cpp | 3 +-- netfs/fuse/fuseApp.h | 18 ++++++++--------- netfs/fuse/fuseApp.impl.h | 43 +++++++++++++++++++++++++++++++++++++++++ netfs/fuse/fuseDirs.cpp | 38 ++++++++++-------------------------- netfs/fuse/fuseFiles.cpp | 49 +++++++++++++++-------------------------------- 5 files changed, 78 insertions(+), 73 deletions(-) create mode 100644 netfs/fuse/fuseApp.impl.h diff --git a/netfs/fuse/fuseApp.cpp b/netfs/fuse/fuseApp.cpp index 17319ec..436df25 100644 --- a/netfs/fuse/fuseApp.cpp +++ b/netfs/fuse/fuseApp.cpp @@ -17,8 +17,7 @@ namespace AdHoc { NetFS::FuseApp::FuseApp(const Ice::StringSeq & a) : args(a), sessionOpened(false), - openDirID(0), - openFileID(0), + openHandleId(0), converter(userLookup, groupLookup) { } diff --git a/netfs/fuse/fuseApp.h b/netfs/fuse/fuseApp.h index 2169e85..1e43166 100644 --- a/netfs/fuse/fuseApp.h +++ b/netfs/fuse/fuseApp.h @@ -104,13 +104,14 @@ namespace NetFS { virtual NetFS::Client::ResourcePtr configureFromUri(const std::string &) const; private: - void setProxy(OpenFilePtr, uint64_t & fh); - OpenFilePtr getFileProxy(uint64_t localID) const; - void clearFileProxy(uint64_t localID); - - void setProxy(OpenDirPtr, uint64_t & fh); - OpenDirPtr getDirProxy(uint64_t localID) const; - void clearDirProxy(uint64_t localID); + template + void setProxy(const Handle &, uint64_t & fh); + template + Handle getProxy(uint64_t localID); + template + void clearProxy(uint64_t localID); + template + std::map & getMap(); ReqEnv reqEnv(); @@ -127,9 +128,8 @@ namespace NetFS { std::string mountPoint; OpenDirs openDirs; - int openDirID; OpenFiles openFiles; - int openFileID; + int openHandleId; EntCache userLookup; EntCache groupLookup; diff --git a/netfs/fuse/fuseApp.impl.h b/netfs/fuse/fuseApp.impl.h new file mode 100644 index 0000000..66fe3b2 --- /dev/null +++ b/netfs/fuse/fuseApp.impl.h @@ -0,0 +1,43 @@ +#ifndef NETFS_FUSE_COMMON_H +#define NETFS_FUSE_COMMON_H + +#include "fuseApp.h" +#include +#include + +namespace NetFS { + template + void + FuseApp::setProxy(const Handle & od, uint64_t & fh) + { + auto & map = getMap(); + Lock(_lock); + while (map.find(fh = ++openHandleId) != map.end()) ; + map.emplace(fh, od); + } + + template + Handle + FuseApp::getProxy(uint64_t localID) + { + const auto & map = getMap(); + SharedLock(_lock); + auto i = map.find(localID); + if (i != map.end()) { + return i->second; + } + throw NetFS::SystemError(EBADF); + } + + template + void + FuseApp::clearProxy(uint64_t localID) + { + auto & map = getMap(); + Lock(_lock); + map.erase(localID); + } +} + +#endif + diff --git a/netfs/fuse/fuseDirs.cpp b/netfs/fuse/fuseDirs.cpp index f872b79..3325375 100644 --- a/netfs/fuse/fuseDirs.cpp +++ b/netfs/fuse/fuseDirs.cpp @@ -1,4 +1,4 @@ -#include "fuseApp.h" +#include "fuseApp.impl.h" #include #include @@ -10,30 +10,11 @@ FuseApp::OpenDir::OpenDir(DirectoryPrx r, const std::string & p) : { } -void -NetFS::FuseApp::setProxy(OpenDirPtr od, uint64_t & fh) +template<> +std::map & +FuseApp::getMap() { - Lock(_lock); - while (openDirs.find(fh = ++openDirID) != openDirs.end()) ; - openDirs.insert({ fh, od }); -} - -NetFS::FuseApp::OpenDirPtr -NetFS::FuseApp::getDirProxy(uint64_t localID) const -{ - SharedLock(_lock); - OpenDirs::const_iterator i = openDirs.find(localID); - if (i != openDirs.end()) { - return i->second; - } - throw NetFS::SystemError(EBADF); -} - -void -NetFS::FuseApp::clearDirProxy(uint64_t localID) -{ - Lock(_lock); - openDirs.erase(localID); + return openDirs; } int @@ -41,7 +22,7 @@ FuseApp::opendir(const char * p, struct fuse_file_info * fi) { try { auto remote = volume->opendir(reqEnv(), p); - setProxy(new OpenDir(remote, p), fi->fh); + setProxy(new OpenDir(remote, p), fi->fh); return 0; } catch (SystemError & e) { @@ -53,12 +34,13 @@ int FuseApp::releasedir(const char *, struct fuse_file_info * fi) { try { - auto remote = getDirProxy(fi->fh)->remote; + auto remote = getProxy(fi->fh)->remote; remote->close(); - clearDirProxy(fi->fh); + clearProxy(fi->fh); return 0; } catch (SystemError & e) { + clearProxy(fi->fh); return -e.syserrno; } } @@ -67,7 +49,7 @@ int FuseApp::readdir(const char * p, void * buf, fuse_fill_dir_t filler, off_t, struct fuse_file_info * fi) { try { - auto od = getDirProxy(fi->fh); + auto od = getProxy(fi->fh); std::string path(p); path += "/"; auto expiry = time(NULL) + 2; diff --git a/netfs/fuse/fuseFiles.cpp b/netfs/fuse/fuseFiles.cpp index 2fc6b26..350e74f 100644 --- a/netfs/fuse/fuseFiles.cpp +++ b/netfs/fuse/fuseFiles.cpp @@ -1,5 +1,5 @@ #include -#include "fuseApp.h" +#include "fuseApp.impl.h" #include "lockHelpers.h" #include @@ -11,30 +11,11 @@ FuseApp::OpenFile::OpenFile(FilePrx r, const std::string & p, int f) : { } -void -NetFS::FuseApp::setProxy(OpenFilePtr of, uint64_t & fh) -{ - Lock(_lock); - while (openFiles.find(fh = ++openFileID) != openFiles.end()) ; - openFiles.insert({ fh, of }); -} - -NetFS::FuseApp::OpenFilePtr -NetFS::FuseApp::getFileProxy(uint64_t localID) const -{ - SharedLock(_lock); - OpenFiles::const_iterator i = openFiles.find(localID); - if (i != openFiles.end()) { - return i->second; - } - throw NetFS::SystemError(EBADF); -} - -void -FuseApp::clearFileProxy(uint64_t localID) +template<> +std::map & +FuseApp::getMap() { - Lock(_lock); - openFiles.erase(localID); + return openFiles; } void @@ -81,7 +62,7 @@ FuseApp::open(const char * p, struct fuse_file_info * fi) { try { auto remote = volume->open(reqEnv(), p, fi->flags); - setProxy(new OpenFile(remote, p, fi->flags), fi->fh); + setProxy(new OpenFile(remote, p, fi->flags), fi->fh); return 0; } catch (SystemError & e) { @@ -94,7 +75,7 @@ FuseApp::create(const char * p, mode_t m, struct fuse_file_info * fi) { try { auto remote = volume->create(reqEnv(), p, fi->flags, m); - setProxy(new OpenFile(remote, p, fi->flags), fi->fh); + setProxy(new OpenFile(remote, p, fi->flags), fi->fh); return 0; } catch (SystemError & e) { @@ -106,7 +87,7 @@ int FuseApp::release(const char *, struct fuse_file_info * fi) { try { - auto of = getFileProxy(fi->fh); + auto of = getProxy(fi->fh); auto remote = of->remote; try { of->flush(); @@ -114,11 +95,11 @@ FuseApp::release(const char *, struct fuse_file_info * fi) catch (SystemError & e) { } remote->close(); - clearFileProxy(fi->fh); + clearProxy(fi->fh); return 0; } catch (SystemError & e) { - clearFileProxy(fi->fh); + clearProxy(fi->fh); return -e.syserrno; } } @@ -127,7 +108,7 @@ int FuseApp::flush(const char *, struct fuse_file_info * fi) { try { - getFileProxy(fi->fh)->flush(); + getProxy(fi->fh)->flush(); return 0; } catch (SystemError & e) { @@ -139,7 +120,7 @@ int FuseApp::read(const char *, char * buf, size_t s, off_t o, struct fuse_file_info * fi) { try { - auto of = getFileProxy(fi->fh); + auto of = getProxy(fi->fh); of->wait(); auto remote = of->remote; Buffer data = remote->read(o, s); @@ -155,7 +136,7 @@ int FuseApp::write(const char *, const char * buf, size_t s, off_t o, struct fuse_file_info * fi) { try { - auto of = getFileProxy(fi->fh); + auto of = getProxy(fi->fh); auto remote = of->remote; auto r = remote->begin_write(o, s, Buffer(buf, buf + s)); if (fcr->Async) { @@ -190,7 +171,7 @@ int FuseApp::ftruncate(const char *, off_t o, fuse_file_info * fi) { try { - auto of = getFileProxy(fi->fh); + auto of = getProxy(fi->fh); of->wait(); auto remote = of->remote; remote->ftruncate(reqEnv(), o); @@ -205,7 +186,7 @@ int FuseApp::fgetattr(const char *, struct stat * s, fuse_file_info * fi) { try { - auto of = getFileProxy(fi->fh); + auto of = getProxy(fi->fh); of->wait(); auto remote = of->remote; *s = converter.convert(remote->fgetattr(reqEnv())); -- cgit v1.2.3