mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-08 03:49:44 -04:00
refactor: add error_code/throwing versions of open
This commit is contained in:
parent
3ae80f564e
commit
ce16e74646
@ -159,6 +159,10 @@ class filesystem_v2 {
|
||||
|
||||
int open(inode_view entry) const { return impl_->open(entry); }
|
||||
|
||||
int open(inode_view entry, std::error_code& ec) const {
|
||||
return impl_->open(entry, ec);
|
||||
}
|
||||
|
||||
size_t
|
||||
read(uint32_t inode, char* buf, size_t size, file_off_t offset = 0) const {
|
||||
return impl_->read(inode, buf, size, offset);
|
||||
@ -277,6 +281,7 @@ class filesystem_v2 {
|
||||
readlink(inode_view entry, readlink_mode mode) const = 0;
|
||||
virtual int statvfs(vfs_stat* stbuf) const = 0;
|
||||
virtual int open(inode_view entry) const = 0;
|
||||
virtual int open(inode_view entry, std::error_code& ec) const = 0;
|
||||
virtual size_t
|
||||
read(uint32_t inode, char* buf, size_t size, file_off_t offset) const = 0;
|
||||
virtual size_t read(uint32_t inode, char* buf, size_t size,
|
||||
|
@ -125,7 +125,9 @@ class metadata_v2 {
|
||||
impl_->access(iv, mode, uid, gid, ec);
|
||||
}
|
||||
|
||||
int open(inode_view iv) const { return impl_->open(iv); }
|
||||
int open(inode_view iv, std::error_code& ec) const {
|
||||
return impl_->open(iv, ec);
|
||||
}
|
||||
|
||||
std::string
|
||||
readlink(inode_view iv, readlink_mode mode, std::error_code& ec) const {
|
||||
@ -203,7 +205,7 @@ class metadata_v2 {
|
||||
virtual void access(inode_view iv, int mode, file_stat::uid_type uid,
|
||||
file_stat::gid_type gid, std::error_code& ec) const = 0;
|
||||
|
||||
virtual int open(inode_view iv) const = 0;
|
||||
virtual int open(inode_view iv, std::error_code& ec) const = 0;
|
||||
|
||||
virtual std::string
|
||||
readlink(inode_view iv, readlink_mode mode, std::error_code& ec) const = 0;
|
||||
|
@ -432,6 +432,7 @@ class filesystem_ final : public filesystem_v2::impl {
|
||||
std::string readlink(inode_view entry, readlink_mode mode) const override;
|
||||
int statvfs(vfs_stat* stbuf) const override;
|
||||
int open(inode_view entry) const override;
|
||||
int open(inode_view entry, std::error_code& ec) const override;
|
||||
size_t read(uint32_t inode, char* buf, size_t size,
|
||||
file_off_t offset) const override;
|
||||
size_t read(uint32_t inode, char* buf, size_t size, file_off_t offset,
|
||||
@ -504,6 +505,7 @@ class filesystem_ final : public filesystem_v2::impl {
|
||||
PERFMON_CLS_TIMER_DECL(readlink_ec)
|
||||
PERFMON_CLS_TIMER_DECL(statvfs)
|
||||
PERFMON_CLS_TIMER_DECL(open)
|
||||
PERFMON_CLS_TIMER_DECL(open_ec)
|
||||
PERFMON_CLS_TIMER_DECL(read)
|
||||
PERFMON_CLS_TIMER_DECL(read_ec)
|
||||
PERFMON_CLS_TIMER_DECL(readv_iovec)
|
||||
@ -587,6 +589,7 @@ filesystem_<LoggerPolicy>::filesystem_(
|
||||
PERFMON_CLS_TIMER_INIT(readlink_ec)
|
||||
PERFMON_CLS_TIMER_INIT(statvfs)
|
||||
PERFMON_CLS_TIMER_INIT(open)
|
||||
PERFMON_CLS_TIMER_INIT(open_ec)
|
||||
PERFMON_CLS_TIMER_INIT(read)
|
||||
PERFMON_CLS_TIMER_INIT(read_ec)
|
||||
PERFMON_CLS_TIMER_INIT(readv_iovec)
|
||||
@ -1123,10 +1126,18 @@ int filesystem_<LoggerPolicy>::statvfs(vfs_stat* stbuf) const {
|
||||
return meta_.statvfs(stbuf);
|
||||
}
|
||||
|
||||
template <typename LoggerPolicy>
|
||||
int filesystem_<LoggerPolicy>::open(inode_view entry,
|
||||
std::error_code& ec) const {
|
||||
PERFMON_CLS_SCOPED_SECTION(open_ec)
|
||||
return meta_.open(entry, ec);
|
||||
}
|
||||
|
||||
template <typename LoggerPolicy>
|
||||
int filesystem_<LoggerPolicy>::open(inode_view entry) const {
|
||||
PERFMON_CLS_SCOPED_SECTION(open)
|
||||
return meta_.open(entry);
|
||||
return call_ec_throw(
|
||||
[&](std::error_code& ec) { return meta_.open(entry, ec); });
|
||||
}
|
||||
|
||||
template <typename LoggerPolicy>
|
||||
|
@ -497,7 +497,7 @@ class metadata_ final : public metadata_v2::impl {
|
||||
void access(inode_view iv, int mode, file_stat::uid_type uid,
|
||||
file_stat::gid_type gid, std::error_code& ec) const override;
|
||||
|
||||
int open(inode_view iv) const override;
|
||||
int open(inode_view iv, std::error_code& ec) const override;
|
||||
|
||||
std::string readlink(inode_view iv, readlink_mode mode,
|
||||
std::error_code& ec) const override;
|
||||
@ -1689,12 +1689,14 @@ void metadata_<LoggerPolicy>::access(inode_view iv, int mode,
|
||||
}
|
||||
|
||||
template <typename LoggerPolicy>
|
||||
int metadata_<LoggerPolicy>::open(inode_view iv) const {
|
||||
int metadata_<LoggerPolicy>::open(inode_view iv, std::error_code& ec) const {
|
||||
if (iv.is_regular_file()) {
|
||||
ec.clear();
|
||||
return iv.inode_num();
|
||||
}
|
||||
|
||||
return -1;
|
||||
ec = std::make_error_code(std::errc::invalid_argument);
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <typename LoggerPolicy>
|
||||
|
@ -427,7 +427,8 @@ BENCHMARK_DEFINE_F(filesystem, open)(::benchmark::State& state) {
|
||||
int i = 0;
|
||||
|
||||
for (auto _ : state) {
|
||||
auto r = fs->open(entries[i++ % NUM_ENTRIES]);
|
||||
std::error_code ec;
|
||||
auto r = fs->open(entries[i++ % NUM_ENTRIES], ec);
|
||||
::benchmark::DoNotOptimize(r);
|
||||
}
|
||||
}
|
||||
|
@ -2376,7 +2376,14 @@ TEST(mkdwarfs_test, filesystem_read_error) {
|
||||
auto iv = fs.find("/somedir");
|
||||
ASSERT_TRUE(iv);
|
||||
EXPECT_TRUE(iv->is_directory());
|
||||
EXPECT_EQ(-1, fs.open(*iv));
|
||||
EXPECT_THAT([&] { fs.open(*iv); }, ::testing::Throws<std::system_error>());
|
||||
{
|
||||
std::error_code ec;
|
||||
auto res = fs.open(*iv, ec);
|
||||
EXPECT_TRUE(ec);
|
||||
EXPECT_EQ(EINVAL, ec.value());
|
||||
EXPECT_EQ(0, res);
|
||||
}
|
||||
{
|
||||
char buf[1];
|
||||
std::error_code ec;
|
||||
|
Loading…
x
Reference in New Issue
Block a user