- lock_guard<recursive_mutex> lock(_mutex);
- _data = realloc(_data, (_sample_count + samples) * _unit_size +
- sizeof(uint64_t));
- memcpy((uint8_t*)_data + _sample_count * _unit_size,
- data, samples * _unit_size);
- _sample_count += samples;
+ lock_guard<recursive_mutex> lock(mutex_);
+
+ assert(capacity_ >= sample_count_);
+
+ // Ensure there's enough capacity to copy.
+ const uint64_t free_space = capacity_ - sample_count_;
+ if (free_space < samples) {
+ set_capacity(sample_count_ + samples);
+ }
+
+ memcpy((uint8_t*)data_.data() + sample_count_ * unit_size_,
+ data, samples * unit_size_);
+ sample_count_ += samples;