]> sigrok.org Git - pulseview.git/blobdiff - pv/data/snapshot.cpp
Rename 'probe' to 'channel' (libsigrokdecode change).
[pulseview.git] / pv / data / snapshot.cpp
index 8571dc6623be52b5b4918a2c00c79b52a1b74f6d..6ba39d2fe9ef57b32f8e67747ccdc65d25dbf170 100644 (file)
@@ -24,7 +24,8 @@
 #include <stdlib.h>
 #include <string.h>
 
-using namespace boost;
+using boost::lock_guard;
+using boost::recursive_mutex;
 
 namespace pv {
 namespace data {
@@ -32,6 +33,7 @@ namespace data {
 Snapshot::Snapshot(int unit_size) :
        _data(NULL),
        _sample_count(0),
+       _capacity(0),
        _unit_size(unit_size)
 {
        lock_guard<recursive_mutex> lock(_mutex);
@@ -50,11 +52,40 @@ uint64_t Snapshot::get_sample_count() const
        return _sample_count;
 }
 
+int Snapshot::unit_size() const
+{
+       return _unit_size;
+}
+
+void Snapshot::set_capacity(const uint64_t new_capacity)
+{
+       lock_guard<recursive_mutex> lock(_mutex);
+
+       assert(_capacity >= _sample_count);
+       if (new_capacity > _capacity) {
+               _capacity = new_capacity;
+               _data = realloc(_data, (new_capacity * _unit_size) + sizeof(uint64_t));
+       }
+}
+
+uint64_t Snapshot::capacity() const
+{
+       lock_guard<recursive_mutex> lock(_mutex);
+       return _capacity;
+}
+
 void Snapshot::append_data(void *data, uint64_t samples)
 {
        lock_guard<recursive_mutex> lock(_mutex);
-       _data = realloc(_data, (_sample_count + samples) * _unit_size +
-               sizeof(uint64_t));
+
+       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 + _sample_count * _unit_size,
                data, samples * _unit_size);
        _sample_count += samples;