Skip to content

Commit

Permalink
file: Use lighter access to map of fs-info-s
Browse files Browse the repository at this point in the history
Every time make_file_impl() creates a file it first counts the number of
entries for the device, then tries to lookup the entry. Instead of
relying on compiler to optimize it, it's nicer to lookup the entry once.

Signed-off-by: Pavel Emelyanov <[email protected]>
  • Loading branch information
xemul committed Jun 18, 2024
1 parent 8b4993a commit cc21298
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/core/file.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1078,7 +1078,8 @@ make_file_impl(int fd, file_open_options options, int flags, struct stat st) noe
auto st_dev = st.st_dev;
static thread_local std::unordered_map<decltype(st_dev), internal::fs_info> s_fstype;

if (s_fstype.count(st_dev) == 0) {
auto i = s_fstype.find(st_dev);
if (i == s_fstype.end()) [[unlikely]] {
return engine().fstatfs(fd).then([fd, options = std::move(options), flags, st = std::move(st)] (struct statfs sfs) {
internal::fs_info fsi;
fsi.block_size = sfs.f_bsize;
Expand Down Expand Up @@ -1126,13 +1127,12 @@ make_file_impl(int fd, file_open_options options, int flags, struct stat st) noe
fsi.fsync_is_exclusive = true;
fsi.nowait_works = false;
}
auto st_dev = st.st_dev;
s_fstype[st_dev] = std::move(fsi);
s_fstype.insert(std::make_pair(st.st_dev, std::move(fsi)));
return make_file_impl(fd, std::move(options), flags, std::move(st));
});
}

const internal::fs_info& fsi = s_fstype[st_dev];
const internal::fs_info& fsi = i->second;
if (!fsi.append_challenged || options.append_is_unlikely || ((flags & O_ACCMODE) == O_RDONLY)) {
return make_ready_future<shared_ptr<file_impl>>(make_shared<posix_file_real_impl>(fd, open_flags(flags), std::move(options), fsi, st_dev));
}
Expand Down

0 comments on commit cc21298

Please sign in to comment.