Complete ring buffer and direct download support #26

This commit is contained in:
Scott E. Graves 2024-12-23 08:35:04 -06:00
parent 2fd0ff8a93
commit 8ff90ae769
2 changed files with 19 additions and 10 deletions

View File

@ -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<std::uint64_t> 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;
}
};

View File

@ -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<double>(read_offset + read_size) /
static_cast<double>(fsi_.size) * 100.0);
event_system::instance().raise<download_progress>(
fsi_.api_path, fsi_.source_path, progress);
}
reset_timeout();
return res;
}