mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-09 12:28:13 -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) const { return impl_->open(entry); }
|
||||||
|
|
||||||
|
int open(inode_view entry, std::error_code& ec) const {
|
||||||
|
return impl_->open(entry, ec);
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
read(uint32_t inode, char* buf, size_t size, file_off_t offset = 0) const {
|
read(uint32_t inode, char* buf, size_t size, file_off_t offset = 0) const {
|
||||||
return impl_->read(inode, buf, size, offset);
|
return impl_->read(inode, buf, size, offset);
|
||||||
@ -277,6 +281,7 @@ class filesystem_v2 {
|
|||||||
readlink(inode_view entry, readlink_mode mode) const = 0;
|
readlink(inode_view entry, readlink_mode mode) const = 0;
|
||||||
virtual int statvfs(vfs_stat* stbuf) const = 0;
|
virtual int statvfs(vfs_stat* stbuf) const = 0;
|
||||||
virtual int open(inode_view entry) 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
|
virtual size_t
|
||||||
read(uint32_t inode, char* buf, size_t size, file_off_t offset) const = 0;
|
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,
|
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);
|
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
|
std::string
|
||||||
readlink(inode_view iv, readlink_mode mode, std::error_code& ec) const {
|
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,
|
virtual void access(inode_view iv, int mode, file_stat::uid_type uid,
|
||||||
file_stat::gid_type gid, std::error_code& ec) const = 0;
|
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
|
virtual std::string
|
||||||
readlink(inode_view iv, readlink_mode mode, std::error_code& ec) const = 0;
|
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;
|
std::string readlink(inode_view entry, readlink_mode mode) const override;
|
||||||
int statvfs(vfs_stat* stbuf) const override;
|
int statvfs(vfs_stat* stbuf) const override;
|
||||||
int open(inode_view entry) 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,
|
size_t read(uint32_t inode, char* buf, size_t size,
|
||||||
file_off_t offset) const override;
|
file_off_t offset) const override;
|
||||||
size_t read(uint32_t inode, char* buf, size_t size, file_off_t offset,
|
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(readlink_ec)
|
||||||
PERFMON_CLS_TIMER_DECL(statvfs)
|
PERFMON_CLS_TIMER_DECL(statvfs)
|
||||||
PERFMON_CLS_TIMER_DECL(open)
|
PERFMON_CLS_TIMER_DECL(open)
|
||||||
|
PERFMON_CLS_TIMER_DECL(open_ec)
|
||||||
PERFMON_CLS_TIMER_DECL(read)
|
PERFMON_CLS_TIMER_DECL(read)
|
||||||
PERFMON_CLS_TIMER_DECL(read_ec)
|
PERFMON_CLS_TIMER_DECL(read_ec)
|
||||||
PERFMON_CLS_TIMER_DECL(readv_iovec)
|
PERFMON_CLS_TIMER_DECL(readv_iovec)
|
||||||
@ -587,6 +589,7 @@ filesystem_<LoggerPolicy>::filesystem_(
|
|||||||
PERFMON_CLS_TIMER_INIT(readlink_ec)
|
PERFMON_CLS_TIMER_INIT(readlink_ec)
|
||||||
PERFMON_CLS_TIMER_INIT(statvfs)
|
PERFMON_CLS_TIMER_INIT(statvfs)
|
||||||
PERFMON_CLS_TIMER_INIT(open)
|
PERFMON_CLS_TIMER_INIT(open)
|
||||||
|
PERFMON_CLS_TIMER_INIT(open_ec)
|
||||||
PERFMON_CLS_TIMER_INIT(read)
|
PERFMON_CLS_TIMER_INIT(read)
|
||||||
PERFMON_CLS_TIMER_INIT(read_ec)
|
PERFMON_CLS_TIMER_INIT(read_ec)
|
||||||
PERFMON_CLS_TIMER_INIT(readv_iovec)
|
PERFMON_CLS_TIMER_INIT(readv_iovec)
|
||||||
@ -1123,10 +1126,18 @@ int filesystem_<LoggerPolicy>::statvfs(vfs_stat* stbuf) const {
|
|||||||
return meta_.statvfs(stbuf);
|
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>
|
template <typename LoggerPolicy>
|
||||||
int filesystem_<LoggerPolicy>::open(inode_view entry) const {
|
int filesystem_<LoggerPolicy>::open(inode_view entry) const {
|
||||||
PERFMON_CLS_SCOPED_SECTION(open)
|
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>
|
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,
|
void access(inode_view iv, int mode, file_stat::uid_type uid,
|
||||||
file_stat::gid_type gid, std::error_code& ec) const override;
|
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::string readlink(inode_view iv, readlink_mode mode,
|
||||||
std::error_code& ec) const override;
|
std::error_code& ec) const override;
|
||||||
@ -1689,12 +1689,14 @@ void metadata_<LoggerPolicy>::access(inode_view iv, int mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename LoggerPolicy>
|
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()) {
|
if (iv.is_regular_file()) {
|
||||||
|
ec.clear();
|
||||||
return iv.inode_num();
|
return iv.inode_num();
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
ec = std::make_error_code(std::errc::invalid_argument);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename LoggerPolicy>
|
template <typename LoggerPolicy>
|
||||||
|
@ -427,7 +427,8 @@ BENCHMARK_DEFINE_F(filesystem, open)(::benchmark::State& state) {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
for (auto _ : state) {
|
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);
|
::benchmark::DoNotOptimize(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2376,7 +2376,14 @@ TEST(mkdwarfs_test, filesystem_read_error) {
|
|||||||
auto iv = fs.find("/somedir");
|
auto iv = fs.find("/somedir");
|
||||||
ASSERT_TRUE(iv);
|
ASSERT_TRUE(iv);
|
||||||
EXPECT_TRUE(iv->is_directory());
|
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];
|
char buf[1];
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user