X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fsnapshot.cpp;h=c02475b7e0ca4efc8f4a2bbca228d3040e7573fd;hb=686a9bf7f6f720f3ad431fbb0103444504709a80;hp=8571dc6623be52b5b4918a2c00c79b52a1b74f6d;hpb=067e5d901290afe79f6991dab8f8042583779256;p=pulseview.git diff --git a/pv/data/snapshot.cpp b/pv/data/snapshot.cpp index 8571dc6..c02475b 100644 --- a/pv/data/snapshot.cpp +++ b/pv/data/snapshot.cpp @@ -24,14 +24,15 @@ #include #include -using namespace boost; +using std::lock_guard; +using std::recursive_mutex; namespace pv { namespace data { -Snapshot::Snapshot(int unit_size) : - _data(NULL), +Snapshot::Snapshot(unsigned int unit_size) : _sample_count(0), + _capacity(0), _unit_size(unit_size) { lock_guard lock(_mutex); @@ -41,7 +42,6 @@ Snapshot::Snapshot(int unit_size) : Snapshot::~Snapshot() { lock_guard lock(_mutex); - free(_data); } uint64_t Snapshot::get_sample_count() const @@ -50,12 +50,41 @@ uint64_t Snapshot::get_sample_count() const 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 + - sizeof(uint64_t)); - memcpy((uint8_t*)_data + _sample_count * _unit_size, + + 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; }