@@ -136,28 +136,40 @@ void FragmentConsolidationWorkspace::resize_buffers(
136136 total_budget = config.buffer_size_ * buffer_num;
137137 }
138138
139- // Make sure the buffers and sizes vectors are large enough.
140- if (buffer_num > buffers_.size ()) {
141- buffers_.resize (buffer_num);
142- sizes_.resize (buffer_num);
143- }
144-
145- // Create buffers.
139+ // Calculate the size of individual buffers by assigning a weight based
140+ // percentage of the total buffer size.
146141 auto total_weights = std::accumulate (
147142 buffer_weights.begin (), buffer_weights.end (), static_cast <size_t >(0 ));
148143
149- // Allocate space for each buffer.
150144 uint64_t adjusted_budget = total_budget / total_weights * total_weights;
151145
152- if (std::max< uint64_t >( 1 , adjusted_budget) > backing_buffer_ .size ()) {
153- backing_buffer_ .resize (std::max< uint64_t >( 1 , adjusted_budget) );
146+ if (buffer_num > buffers_ .size ()) {
147+ sizes_ .resize (buffer_num );
154148 }
155149
156- // Finally allocate spans for the buffers.
157150 size_t offset = 0 ;
158151 for (unsigned i = 0 ; i < buffer_num; ++i) {
159152 sizes_[i] = std::max<uint64_t >(
160153 1 , adjusted_budget * buffer_weights[i] / total_weights);
154+ offset += sizes_[i];
155+ }
156+
157+ // Total size is the final offset value
158+ size_t final_budget = offset;
159+
160+ // Ensure that our backing buffer is large enough to reference the final
161+ // budget number of bytes.
162+ if (final_budget > backing_buffer_.size ()) {
163+ backing_buffer_.resize (final_budget);
164+ }
165+
166+ // Finally, update our spans referencing the backing buffer.
167+ if (buffer_num > buffers_.size ()) {
168+ buffers_.resize (buffer_num);
169+ }
170+
171+ offset = 0 ;
172+ for (unsigned i = 0 ; i < buffer_num; ++i) {
161173 buffers_[i] = span (&(backing_buffer_[offset]), sizes_[i]);
162174 offset += sizes_[i];
163175 }
0 commit comments