Complete ring buffer and direct download support #26
This commit is contained in:
parent
539d7e8402
commit
4f419be42d
@ -101,6 +101,38 @@ ring_buffer_open_file::~ring_buffer_open_file() {
|
|||||||
reader_thread_.reset();
|
reader_thread_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ring_buffer_open_file::background_reader_thread() {
|
||||||
|
unique_mutex_lock chunk_lock(chunk_mtx_);
|
||||||
|
auto next_chunk = ring_pos_;
|
||||||
|
chunk_notify_.notify_all();
|
||||||
|
chunk_lock.unlock();
|
||||||
|
|
||||||
|
while (not stop_requested_) {
|
||||||
|
chunk_lock.lock();
|
||||||
|
|
||||||
|
next_chunk = next_chunk + 1U > ring_end_ ? ring_begin_ : next_chunk + 1U;
|
||||||
|
const auto check_and_wait = [this, &chunk_lock, &next_chunk]() {
|
||||||
|
if (get_read_state().all()) {
|
||||||
|
chunk_notify_.wait(chunk_lock);
|
||||||
|
next_chunk = ring_pos_;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk_notify_.notify_all();
|
||||||
|
chunk_lock.unlock();
|
||||||
|
};
|
||||||
|
|
||||||
|
if (not ring_state_[next_chunk % ring_state_.size()]) {
|
||||||
|
check_and_wait();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk_notify_.notify_all();
|
||||||
|
chunk_lock.unlock();
|
||||||
|
|
||||||
|
download_chunk(next_chunk, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto ring_buffer_open_file::can_handle_file(std::uint64_t file_size,
|
auto ring_buffer_open_file::can_handle_file(std::uint64_t file_size,
|
||||||
std::size_t chunk_size,
|
std::size_t chunk_size,
|
||||||
std::size_t ring_size) -> bool {
|
std::size_t ring_size) -> bool {
|
||||||
@ -371,36 +403,4 @@ void ring_buffer_open_file::set_api_path(const std::string &api_path) {
|
|||||||
open_file_base::set_api_path(api_path);
|
open_file_base::set_api_path(api_path);
|
||||||
chunk_notify_.notify_all();
|
chunk_notify_.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ring_buffer_open_file::background_reader_thread() {
|
|
||||||
unique_mutex_lock chunk_lock(chunk_mtx_);
|
|
||||||
auto next_chunk = ring_pos_;
|
|
||||||
chunk_notify_.notify_all();
|
|
||||||
chunk_lock.unlock();
|
|
||||||
|
|
||||||
while (not stop_requested_) {
|
|
||||||
chunk_lock.lock();
|
|
||||||
|
|
||||||
next_chunk = next_chunk + 1U > ring_end_ ? ring_begin_ : next_chunk + 1U;
|
|
||||||
const auto check_and_wait = [this, &chunk_lock, &next_chunk]() {
|
|
||||||
if (get_read_state().all()) {
|
|
||||||
chunk_notify_.wait(chunk_lock);
|
|
||||||
next_chunk = ring_pos_;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk_notify_.notify_all();
|
|
||||||
chunk_lock.unlock();
|
|
||||||
};
|
|
||||||
|
|
||||||
if (not ring_state_[next_chunk % ring_state_.size()]) {
|
|
||||||
check_and_wait();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk_notify_.notify_all();
|
|
||||||
chunk_lock.unlock();
|
|
||||||
|
|
||||||
download_chunk(next_chunk, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace repertory
|
} // namespace repertory
|
||||||
|
Loading…
x
Reference in New Issue
Block a user