X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fsnapshot.cpp;h=80b9fb3792e09e25a099edd631461ba67f411569;hb=8dbbc7f0b9ea59d0f0d62225772f8a56eee125f5;hp=afd1e43e7c7b3169e792adb4336db4b171fcfd8c;hpb=e7c6e89875ce1a25ff4e69abcd792c4c93e4ddde;p=pulseview.git diff --git a/pv/data/snapshot.cpp b/pv/data/snapshot.cpp index afd1e43e..80b9fb37 100644 --- a/pv/data/snapshot.cpp +++ b/pv/data/snapshot.cpp @@ -24,39 +24,69 @@ #include #include -using namespace boost; +using std::lock_guard; +using std::recursive_mutex; namespace pv { namespace data { -Snapshot::Snapshot(int unit_size) : - _data(NULL), - _sample_count(0), - _unit_size(unit_size) +Snapshot::Snapshot(unsigned int unit_size) : + sample_count_(0), + capacity_(0), + unit_size_(unit_size) { - lock_guard lock(_mutex); - assert(_unit_size > 0); + lock_guard lock(mutex_); + assert(unit_size_ > 0); } Snapshot::~Snapshot() { - lock_guard lock(_mutex); - free(_data); + lock_guard lock(mutex_); } uint64_t Snapshot::get_sample_count() const { - lock_guard lock(_mutex); - return _sample_count; + lock_guard lock(mutex_); + return sample_count_; +} + +unsigned int Snapshot::unit_size() const +{ + return unit_size_; +} + +void Snapshot::set_capacity(const uint64_t new_capacity) +{ + lock_guard lock(mutex_); + + assert(capacity_ >= sample_count_); + if (new_capacity > capacity_) { + capacity_ = new_capacity; + data_.resize((new_capacity * unit_size_) + sizeof(uint64_t)); + } +} + +uint64_t Snapshot::capacity() const +{ + lock_guard lock(mutex_); + return data_.size(); } void Snapshot::append_data(void *data, uint64_t samples) { - lock_guard lock(_mutex); - _data = realloc(_data, (_sample_count + samples) * _unit_size); - memcpy((uint8_t*)_data + _sample_count * _unit_size, - data, samples * _unit_size); - _sample_count += samples; + lock_guard 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; } } // namespace data