X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fsnapshot.cpp;h=39fdc011f1602e2686721b79bf6d9377a5e1cb40;hp=f3855e06c34ce9bf7cf829b5b27085f70bcb82e7;hb=ff008de665c7990d5f3408f918ff090d8e6c60b2;hpb=1b1ec774978b65209ce2b454cbf81da499b797d2 diff --git a/pv/data/snapshot.cpp b/pv/data/snapshot.cpp index f3855e06..39fdc011 100644 --- a/pv/data/snapshot.cpp +++ b/pv/data/snapshot.cpp @@ -18,45 +18,92 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "snapshot.h" +#include "snapshot.hpp" #include #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(uint64_t samplerate, unsigned int unit_size) : + sample_count_(0), + start_time_(0), + samplerate_(samplerate), + 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() +uint64_t Snapshot::get_sample_count() const { - lock_guard lock(_mutex); - return _sample_count; + lock_guard lock(mutex_); + return sample_count_; +} + +double Snapshot::start_time() const +{ + return start_time_; +} + +double Snapshot::samplerate() const +{ + return samplerate_; +} + +void Snapshot::set_samplerate(double samplerate) +{ + samplerate_ = samplerate; +} + +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