From e161113ad539b7f4db1bbe7d337eb7da93cf767a Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 25 Dec 2024 17:01:20 -0600 Subject: [PATCH] fix open file data --- .../include/file_manager/i_open_file.hpp | 3 +++ .../include/file_manager/open_file_base.hpp | 7 ++++--- .../file_manager/ring_buffer_open_file.hpp | 2 +- .../src/file_manager/file_manager.cpp | 1 + .../src/file_manager/open_file_base.cpp | 16 ++++++++++++++-- .../include/mocks/mock_open_file.hpp | 4 ++++ 6 files changed, 27 insertions(+), 6 deletions(-) diff --git a/repertory/librepertory/include/file_manager/i_open_file.hpp b/repertory/librepertory/include/file_manager/i_open_file.hpp index 758d9a17..00c5b749 100644 --- a/repertory/librepertory/include/file_manager/i_open_file.hpp +++ b/repertory/librepertory/include/file_manager/i_open_file.hpp @@ -82,6 +82,9 @@ public: virtual void set_api_path(const std::string &api_path) = 0; + virtual void + set_open_data(std::map open_data) = 0; + [[nodiscard]] virtual auto write(std::uint64_t write_offset, const data_buffer &data, std::size_t &bytes_written) -> api_error = 0; diff --git a/repertory/librepertory/include/file_manager/open_file_base.hpp b/repertory/librepertory/include/file_manager/open_file_base.hpp index 2c5b6550..346e7f4d 100644 --- a/repertory/librepertory/include/file_manager/open_file_base.hpp +++ b/repertory/librepertory/include/file_manager/open_file_base.hpp @@ -178,9 +178,7 @@ public: return fsi_.source_path; } - [[nodiscard]] auto has_handle(std::uint64_t handle) const -> bool override { - return open_data_.find(handle) != open_data_.end(); - } + [[nodiscard]] auto has_handle(std::uint64_t handle) const -> bool override; [[nodiscard]] auto is_directory() const -> bool override { return fsi_.directory; @@ -193,6 +191,9 @@ public: void remove_all() override; void set_api_path(const std::string &api_path) override; + + void + set_open_data(std::map open_data) override; }; } // namespace repertory diff --git a/repertory/librepertory/include/file_manager/ring_buffer_open_file.hpp b/repertory/librepertory/include/file_manager/ring_buffer_open_file.hpp index cb68f5ae..247d0a03 100644 --- a/repertory/librepertory/include/file_manager/ring_buffer_open_file.hpp +++ b/repertory/librepertory/include/file_manager/ring_buffer_open_file.hpp @@ -118,7 +118,7 @@ public: [[nodiscard]] auto read(std::size_t read_size, std::uint64_t read_offset, data_buffer &data) -> api_error override; - [[nodiscard]] auto resize(std::uint64_t) -> api_error override { + [[nodiscard]] auto resize(std::uint64_t /* size */) -> api_error override { return api_error::not_supported; } diff --git a/repertory/librepertory/src/file_manager/file_manager.cpp b/repertory/librepertory/src/file_manager/file_manager.cpp index 65234cd8..a295940b 100644 --- a/repertory/librepertory/src/file_manager/file_manager.cpp +++ b/repertory/librepertory/src/file_manager/file_manager.cpp @@ -259,6 +259,7 @@ auto file_manager::get_open_file(std::uint64_t handle, bool write_supported, : 0U, file_ptr->get_filesystem_item(), file_ptr->get_open_data(), provider_, *this); + writeable_file->set_open_data(file_ptr->get_open_data()); open_file_lookup_[file_ptr->get_api_path()] = writeable_file; file = writeable_file; return true; diff --git a/repertory/librepertory/src/file_manager/open_file_base.cpp b/repertory/librepertory/src/file_manager/open_file_base.cpp index b309c408..e030d54c 100644 --- a/repertory/librepertory/src/file_manager/open_file_base.cpp +++ b/repertory/librepertory/src/file_manager/open_file_base.cpp @@ -127,8 +127,8 @@ auto open_file_base::can_close() const -> bool { return true; } - const std::chrono::system_clock::time_point last_access = last_access_; - const auto duration = std::chrono::duration_cast( + std::chrono::system_clock::time_point last_access{last_access_}; + auto duration = std::chrono::duration_cast( std::chrono::system_clock::now() - last_access); return (duration.count() >= chunk_timeout_); } @@ -198,6 +198,7 @@ auto open_file_base::get_filesystem_item() const -> filesystem_item { auto open_file_base::get_handles() const -> std::vector { recur_mutex_lock file_lock(file_mtx_); + std::vector ret; for (const auto &item : open_data_) { ret.emplace_back(item.first); @@ -234,6 +235,11 @@ auto open_file_base::get_open_file_count() const -> std::size_t { return open_data_.size(); } +auto open_file_base::has_handle(std::uint64_t handle) const -> bool { + recur_mutex_lock file_lock(file_mtx_); + return open_data_.find(handle) != open_data_.end(); +} + auto open_file_base::is_modified() const -> bool { recur_mutex_lock file_lock(file_mtx_); return modified_; @@ -297,6 +303,12 @@ void open_file_base::set_api_path(const std::string &api_path) { fsi_.api_parent = utils::path::get_parent_api_path(api_path); } +void open_file_base::set_open_data( + std::map open_data) { + recur_mutex_lock file_lock(file_mtx_); + open_data_ = std::move(open_data); +} + auto open_file_base::close() -> bool { unique_mutex_lock io_lock(io_thread_mtx_); if (io_stop_requested_ || not io_thread_) { diff --git a/repertory/repertory_test/include/mocks/mock_open_file.hpp b/repertory/repertory_test/include/mocks/mock_open_file.hpp index eb4fb8e7..677416d8 100644 --- a/repertory/repertory_test/include/mocks/mock_open_file.hpp +++ b/repertory/repertory_test/include/mocks/mock_open_file.hpp @@ -102,6 +102,10 @@ public: MOCK_METHOD(void, remove, (std::uint64_t handle), (override)); MOCK_METHOD(void, remove_all, (), (override)); + + MOCK_METHOD(void, set_open_data, + ((std::map open_data)), + (override)); }; } // namespace repertory