This commit is contained in:
		@@ -309,11 +309,10 @@ void open_file::download_chunk(std::size_t chunk, bool skip_active,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void open_file::download_range(std::size_t start_chunk, std::size_t end_chunk,
 | 
					void open_file::download_range(std::size_t start_chunk, std::size_t end_chunk,
 | 
				
			||||||
                               bool should_reset) {
 | 
					                               bool should_reset) {
 | 
				
			||||||
  for (std::size_t chunk = start_chunk; chunk <= end_chunk; ++chunk) {
 | 
					  for (std::size_t chunk = start_chunk;
 | 
				
			||||||
 | 
					       (get_api_error() == api_error::success) && (chunk <= end_chunk);
 | 
				
			||||||
 | 
					       ++chunk) {
 | 
				
			||||||
    download_chunk(chunk, false, should_reset);
 | 
					    download_chunk(chunk, false, should_reset);
 | 
				
			||||||
    if (get_api_error() != api_error::success) {
 | 
					 | 
				
			||||||
      return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -558,35 +557,36 @@ void open_file::update_background_reader(std::size_t read_chunk) {
 | 
				
			|||||||
  recur_mutex_lock reader_lock(file_mtx_);
 | 
					  recur_mutex_lock reader_lock(file_mtx_);
 | 
				
			||||||
  read_chunk_ = read_chunk;
 | 
					  read_chunk_ = read_chunk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (not reader_thread_ && not stop_requested_) {
 | 
					  if (reader_thread_ || stop_requested_) {
 | 
				
			||||||
    reader_thread_ = std::make_unique<std::thread>([this]() {
 | 
					    return;
 | 
				
			||||||
      std::size_t next_chunk{};
 | 
					 | 
				
			||||||
      while (not stop_requested_) {
 | 
					 | 
				
			||||||
        unique_recur_mutex_lock file_lock(file_mtx_);
 | 
					 | 
				
			||||||
        if ((fsi_.size == 0U) || read_state_.all()) {
 | 
					 | 
				
			||||||
          file_lock.unlock();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          unique_mutex_lock io_lock(io_thread_mtx_);
 | 
					 | 
				
			||||||
          if (not stop_requested_ && io_thread_queue_.empty()) {
 | 
					 | 
				
			||||||
            io_thread_notify_.wait(io_lock);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          io_thread_notify_.notify_all();
 | 
					 | 
				
			||||||
          io_lock.unlock();
 | 
					 | 
				
			||||||
          continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        do {
 | 
					 | 
				
			||||||
          next_chunk = read_chunk_ = ((read_chunk_ + 1U) >= read_state_.size())
 | 
					 | 
				
			||||||
                                         ? 0U
 | 
					 | 
				
			||||||
                                         : read_chunk_ + 1U;
 | 
					 | 
				
			||||||
        } while ((next_chunk != 0U) && (active_downloads_.find(next_chunk) !=
 | 
					 | 
				
			||||||
                                        active_downloads_.end()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        file_lock.unlock();
 | 
					 | 
				
			||||||
        download_chunk(next_chunk, true, false);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  reader_thread_ = std::make_unique<std::thread>([this]() {
 | 
				
			||||||
 | 
					    std::size_t next_chunk{};
 | 
				
			||||||
 | 
					    while (not stop_requested_) {
 | 
				
			||||||
 | 
					      unique_recur_mutex_lock file_lock(file_mtx_);
 | 
				
			||||||
 | 
					      if ((fsi_.size == 0U) || read_state_.all()) {
 | 
				
			||||||
 | 
					        file_lock.unlock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        unique_mutex_lock io_lock(io_thread_mtx_);
 | 
				
			||||||
 | 
					        if (not stop_requested_ && io_thread_queue_.empty()) {
 | 
				
			||||||
 | 
					          io_thread_notify_.wait(io_lock);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        io_thread_notify_.notify_all();
 | 
				
			||||||
 | 
					        io_lock.unlock();
 | 
				
			||||||
 | 
					        continue;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      do {
 | 
				
			||||||
 | 
					        next_chunk = read_chunk_ =
 | 
				
			||||||
 | 
					            ((read_chunk_ + 1U) >= read_state_.size()) ? 0U : read_chunk_ + 1U;
 | 
				
			||||||
 | 
					      } while ((next_chunk != 0U) &&
 | 
				
			||||||
 | 
					               (active_downloads_.find(next_chunk) != active_downloads_.end()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      file_lock.unlock();
 | 
				
			||||||
 | 
					      download_chunk(next_chunk, true, false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
auto open_file::write(std::uint64_t write_offset, const data_buffer &data,
 | 
					auto open_file::write(std::uint64_t write_offset, const data_buffer &data,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user