21#include <condition_variable>
45template<
typename T = u
int16_t>
83 std::unique_lock<std::mutex> lock(
mutex_);
87 grklog.warn(
"ChunkBuffer: attempt to increment offset out of bounds");
104 std::unique_lock<std::mutex> lock(
mutex_);
106 size_t new_offset =
offset_ + (size_t)off;
110 grklog.warn(
"ChunkBuffer: attempt to increment offset out of bounds");
120 const uint8_t*
currPtr(
size_t desired_region)
const
122 std::unique_lock<std::mutex> lock(
mutex_);
128 cv_.wait(lock, [
this, relative_offset, desired_region]() {
133 size_t start_chunk = relative_offset /
chunkSize_;
134 size_t offset_in_chunk = relative_offset %
chunkSize_;
135 size_t end_offset = relative_offset + desired_region;
140 std::cout <<
"Warning: Out of bounds - truncating";
145 auto chunk_idx = start_chunk -
static_cast<size_t>(
base_);
148 throw std::runtime_error(
"Missing chunk in contiguous sequence");
150 const auto& chunk_data =
buffers_[chunk_idx];
151 if(offset_in_chunk + desired_region <= chunk_data.size())
153 return chunk_data.data() + offset_in_chunk;
157 auto& result =
owned_buffers_.emplace_back(relative_offset, std::vector<uint8_t>());
158 auto& buffer = result.second;
159 buffer.reserve(desired_region);
160 size_t bytes_remaining = desired_region;
164 auto idx = i -
static_cast<size_t>(
base_);
167 throw std::runtime_error(
"Missing chunk in contiguous sequence");
170 size_t chunk_start = (i == start_chunk) ? offset_in_chunk : 0;
171 size_t bytes_to_copy = std::min(bytes_remaining, cd.size() - chunk_start);
172 buffer.insert(buffer.end(), cd.begin() +
static_cast<ptrdiff_t
>(chunk_start),
173 cd.begin() +
static_cast<ptrdiff_t
>(chunk_start + bytes_to_copy));
174 bytes_remaining -= bytes_to_copy;
176 return buffer.data();
178 void add(T fetch_index,
const uint8_t* buffer,
size_t size)
182 throw std::runtime_error(
"Buffer size exceeds chunk size");
186 std::unique_lock<std::mutex> lock(
mutex_);
188 auto idx =
static_cast<size_t>(fetch_index) -
static_cast<size_t>(
base_);
189 buffers_[idx] = std::vector<uint8_t>(buffer, buffer +
size);
191 auto contiguous_chunk =
bufferheap_.push_and_pop(fetch_index);
195 if(contiguous_chunk.has_value())
202 throw std::runtime_error(
"Invalid contiguous chunk index returned by heap");
204 new_contiguous_length =
207 new_contiguous_length = std::min(new_contiguous_length,
length_);
217 std::lock_guard<std::mutex> lock(
mutex_);
220 if(
offset > rel_contiguous)
225 size_t buf_end = buf.first + buf.second.size();
259 mutable std::condition_variable
cv_;
SimpleHeap< T > bufferheap_
Definition ChunkBuffer.h:254
T last_contiguous_chunk_
Definition ChunkBuffer.h:255
bool increment_offset(std::ptrdiff_t off)
Definition ChunkBuffer.h:98
std::mutex mutex_
Definition ChunkBuffer.h:258
ChunkBuffer(size_t chunkSize, size_t offset, size_t length)
Definition ChunkBuffer.h:50
std::deque< std::vector< uint8_t > > buffers_
Definition ChunkBuffer.h:252
T base_
Definition ChunkBuffer.h:253
std::list< std::pair< size_t, std::vector< uint8_t > > > owned_buffers_
Definition ChunkBuffer.h:257
size_t chunkSize() const
Definition ChunkBuffer.h:76
void free_before(size_t offset)
Definition ChunkBuffer.h:215
size_t initialOffset() const
Definition ChunkBuffer.h:71
size_t offset() const
Definition ChunkBuffer.h:66
size_t length_
Definition ChunkBuffer.h:250
size_t contiguous_length_
Definition ChunkBuffer.h:256
T index_type
Definition ChunkBuffer.h:49
const uint8_t * currPtr(size_t desired_region) const
Definition ChunkBuffer.h:120
size_t chunkSize_
Definition ChunkBuffer.h:248
bool set_offset(size_t new_offset)
Definition ChunkBuffer.h:81
std::condition_variable cv_
Definition ChunkBuffer.h:259
size_t initialOffset_
Definition ChunkBuffer.h:251
size_t offset_
Definition ChunkBuffer.h:249
size_t size() const
Definition ChunkBuffer.h:61
void add(T fetch_index, const uint8_t *buffer, size_t size)
Definition ChunkBuffer.h:178
A simple non-thread-safe min-heap for tracking contiguous sequences of size_t indices.
Definition MinHeap.h:34
ResWindow.
Definition CompressedChunkCache.h:36
ILogger & grklog
Definition Logger.cpp:24