From 8ff90ae769a3f93b98942597a0a7bd8b8f47d5b2 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Mon, 23 Dec 2024 08:35:04 -0600 Subject: [PATCH] Complete ring buffer and direct download support #26 --- .../include/file_manager/direct_open_file.hpp | 17 +++++++++-------- .../src/file_manager/direct_open_file.cpp | 12 ++++++++++-- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/repertory/librepertory/include/file_manager/direct_open_file.hpp b/repertory/librepertory/include/file_manager/direct_open_file.hpp index 87002f15..088f2573 100644 --- a/repertory/librepertory/include/file_manager/direct_open_file.hpp +++ b/repertory/librepertory/include/file_manager/direct_open_file.hpp @@ -42,10 +42,11 @@ public: direct_open_file(const direct_open_file &) noexcept = delete; direct_open_file(direct_open_file &&) noexcept = delete; auto operator=(direct_open_file &&) noexcept -> direct_open_file & = delete; - auto - operator=(const direct_open_file &) noexcept -> direct_open_file & = delete; + auto operator=(const direct_open_file &) noexcept + -> direct_open_file & = delete; private: + std::atomic last_progress_{0U}; std::size_t total_chunks_; stop_type stop_requested_{false}; @@ -63,13 +64,13 @@ public: return false; } - [[nodiscard]] auto - get_read_state() const -> boost::dynamic_bitset<> override { + [[nodiscard]] auto get_read_state() const + -> boost::dynamic_bitset<> override { return {}; } - [[nodiscard]] auto - get_read_state(std::size_t /* chunk */) const -> bool override { + [[nodiscard]] auto get_read_state(std::size_t /* chunk */) const + -> bool override { return false; } @@ -95,8 +96,8 @@ public: return api_error::not_supported; } - [[nodiscard]] auto write(std::uint64_t, const data_buffer &, - std::size_t &) -> api_error override { + [[nodiscard]] auto write(std::uint64_t, const data_buffer &, std::size_t &) + -> api_error override { return api_error::not_supported; } }; diff --git a/repertory/librepertory/src/file_manager/direct_open_file.cpp b/repertory/librepertory/src/file_manager/direct_open_file.cpp index 4c150121..813468ed 100644 --- a/repertory/librepertory/src/file_manager/direct_open_file.cpp +++ b/repertory/librepertory/src/file_manager/direct_open_file.cpp @@ -27,6 +27,7 @@ #include "providers/i_provider.hpp" #include "types/repertory.hpp" #include "utils/common.hpp" +#include "utils/time.hpp" namespace repertory { direct_open_file::direct_open_file(std::uint64_t chunk_size, @@ -40,6 +41,7 @@ direct_open_file::~direct_open_file() { close(); } auto direct_open_file::close() -> bool { stop_requested_ = true; + last_progress_ = 0U; return open_file_base::close(); } @@ -58,13 +60,19 @@ auto direct_open_file::read(std::size_t read_size, std::uint64_t read_offset, auto res = provider_.read_file_bytes(fsi_.api_path, read_size, read_offset, data, stop_requested_); - if (res == api_error::success) { + if (res != api_error::success) { + return res; + } + + reset_timeout(); + if ((utils::time::get_time_now() - last_progress_.load()) > + (2U * utils::time::NANOS_PER_SECOND)) { + last_progress_ = utils::time::get_time_now(); auto progress = (static_cast(read_offset + read_size) / static_cast(fsi_.size) * 100.0); event_system::instance().raise( fsi_.api_path, fsi_.source_path, progress); } - reset_timeout(); return res; }