aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Benjamin Barenblat <bbaren@mit.edu>2016-02-20 15:04:07 -0500
committerGravatar Benjamin Barenblat <bbaren@mit.edu>2016-02-20 15:04:07 -0500
commit60cbb719e7e9b14d4966efcead89bca4fc022c8e (patch)
tree4155998637f8d8a2cdcc9e0f9be192795bf80d78
parent3ecdcdac59fa0417c73b3bf7bd5ac0a2728bd502 (diff)
Deduplicate resource release functions
-rw-r--r--src/operations.cc27
1 files changed, 9 insertions, 18 deletions
diff --git a/src/operations.cc b/src/operations.cc
index 2f1a103..375a039 100644
--- a/src/operations.cc
+++ b/src/operations.cc
@@ -41,14 +41,6 @@ namespace {
// Pointer to the directory underlying the mount point.
File* root_;
-File* FileInfoFile(fuse_file_info* const file_info) noexcept {
- return reinterpret_cast<File*>(file_info->fh);
-}
-
-Directory* FileInfoDirectory(fuse_file_info* const file_info) noexcept {
- return reinterpret_cast<Directory*>(file_info->fh);
-}
-
mode_t DirectoryTypeToFileType(const unsigned char type) noexcept {
return static_cast<mode_t>(DTTOIF(type));
}
@@ -109,6 +101,12 @@ int OpenResource(const char* const path, const int flags, const mode_t mode,
}
}
+template <typename T>
+int ReleaseResource(const uint64_t handle) noexcept {
+ delete reinterpret_cast<T*>(handle);
+ return 0;
+}
+
int Open(const char* const path, fuse_file_info* const file_info) noexcept {
return OpenResource<File>(path, file_info->flags, 0777, &file_info->fh);
}
@@ -133,8 +131,7 @@ int Create(const char* const path, const mode_t mode,
}
int Release(const char*, fuse_file_info* const file_info) noexcept {
- delete FileInfoFile(file_info);
- return 0;
+ return ReleaseResource<File>(file_info->fh);
}
int Opendir(const char* const path, fuse_file_info* const file_info) noexcept {
@@ -144,7 +141,7 @@ int Opendir(const char* const path, fuse_file_info* const file_info) noexcept {
int Readdir(const char*, void* const buffer, fuse_fill_dir_t filler,
const off_t offset, fuse_file_info* const file_info) noexcept {
try {
- Directory* const directory = FileInfoDirectory(file_info);
+ auto* const directory = reinterpret_cast<Directory*>(file_info->fh);
static_assert(std::is_same<off_t, long>(),
"off_t is not convertible with long");
@@ -174,13 +171,7 @@ int Readdir(const char*, void* const buffer, fuse_fill_dir_t filler,
}
int Releasedir(const char*, fuse_file_info* const file_info) noexcept {
- try {
- delete FileInfoDirectory(file_info);
- return 0;
- } catch (...) {
- LOG(ERROR) << "releasedir: caught unexpected value";
- return -ENOTRECOVERABLE;
- }
+ return ReleaseResource<Directory>(file_info->fh);
}
} // namespace