]> sigrok.org Git - pulseview.git/commitdiff
Snapshot classes: Use vector instead of raw pointer
authorJens Steinhauser <redacted>
Wed, 27 Aug 2014 09:12:40 +0000 (11:12 +0200)
committerUwe Hermann <redacted>
Wed, 27 Aug 2014 16:54:35 +0000 (18:54 +0200)
As a side-effect this turns a segfault (see bug #397) into a segfault
with a more usable message:

  terminate called after throwing an instance of 'std::bad_alloc'
    what():  std::bad_alloc
  Aborted (core dumped)

pv/data/analogsnapshot.cpp
pv/data/logicsnapshot.cpp
pv/data/snapshot.cpp
pv/data/snapshot.h

index 9e9b5a0ffeb8bb3ce0c8b6adb3e5289b9213c4d6..2a14d1ea0a0f37bf7687ca3f2f48f864e1849497 100644 (file)
@@ -68,9 +68,9 @@ void AnalogSnapshot::append_interleaved_samples(const float *data,
 
        lock_guard<recursive_mutex> lock(_mutex);
 
-       _data = realloc(_data, (_sample_count + sample_count) * sizeof(float));
+       _data.resize((_sample_count + sample_count) * sizeof(float));
 
-       float *dst = (float*)_data + _sample_count;
+       float *dst = (float*)_data.data() + _sample_count;
        const float *dst_end = dst + sample_count;
        while (dst != dst_end)
        {
@@ -96,7 +96,7 @@ const float* AnalogSnapshot::get_samples(
        lock_guard<recursive_mutex> lock(_mutex);
 
        float *const data = new float[end_sample - start_sample];
-       memcpy(data, (float*)_data + start_sample, sizeof(float) *
+       memcpy(data, (float*)_data.data() + start_sample, sizeof(float) *
                (end_sample - start_sample));
        return data;
 }
@@ -156,9 +156,9 @@ void AnalogSnapshot::append_payload_to_envelope_levels()
        dest_ptr = e0.samples + prev_length;
 
        // Iterate through the samples to populate the first level mipmap
-       const float *const end_src_ptr = (float*)_data +
+       const float *const end_src_ptr = (float*)_data.data() +
                e0.length * EnvelopeScaleFactor;
-       for (const float *src_ptr = (float*)_data +
+       for (const float *src_ptr = (float*)_data.data() +
                prev_length * EnvelopeScaleFactor;
                src_ptr < end_src_ptr; src_ptr += EnvelopeScaleFactor)
        {
index 3bd43c9208182e92bed8d46b8bea108d1e1af4c5..f1ff3c3c267fbf14a7fa56aba4b6a48843c0b1dd 100644 (file)
@@ -162,7 +162,7 @@ void LogicSnapshot::get_samples(uint8_t *const data,
        lock_guard<recursive_mutex> lock(_mutex);
 
        const size_t size = (end_sample - start_sample) * _unit_size;
-       memcpy(data, (const uint8_t*)_data + start_sample * _unit_size, size);
+       memcpy(data, (const uint8_t*)_data.data() + start_sample * _unit_size, size);
 }
 
 void LogicSnapshot::reallocate_mipmap_level(MipMapLevel &m)
@@ -201,9 +201,9 @@ void LogicSnapshot::append_payload_to_mipmap()
        dest_ptr = (uint8_t*)m0.data + prev_length * _unit_size;
 
        // Iterate through the samples to populate the first level mipmap
-       const uint8_t *const end_src_ptr = (uint8_t*)_data +
+       const uint8_t *const end_src_ptr = (uint8_t*)_data.data() +
                m0.length * _unit_size * MipMapScaleFactor;
-       for (src_ptr = (uint8_t*)_data +
+       for (src_ptr = (uint8_t*)_data.data() +
                prev_length * _unit_size * MipMapScaleFactor;
                src_ptr < end_src_ptr;)
        {
@@ -266,7 +266,7 @@ uint64_t LogicSnapshot::get_sample(uint64_t index) const
        assert(_data);
        assert(index < _sample_count);
 
-       return unpack_sample((uint8_t*)_data + index * _unit_size);
+       return unpack_sample((uint8_t*)_data.data() + index * _unit_size);
 }
 
 void LogicSnapshot::get_subsampled_edges(
index 2f3f041346b3a96709b21d529c7f5cd2747b7b48..e8e285e7913dd49117bbee0b2c182437b929df51 100644 (file)
@@ -31,7 +31,6 @@ namespace pv {
 namespace data {
 
 Snapshot::Snapshot(int unit_size) :
-       _data(NULL),
        _sample_count(0),
        _capacity(0),
        _unit_size(unit_size)
@@ -43,7 +42,6 @@ Snapshot::Snapshot(int unit_size) :
 Snapshot::~Snapshot()
 {
        lock_guard<recursive_mutex> lock(_mutex);
-       free(_data);
 }
 
 uint64_t Snapshot::get_sample_count() const
@@ -64,14 +62,14 @@ void Snapshot::set_capacity(const uint64_t new_capacity)
        assert(_capacity >= _sample_count);
        if (new_capacity > _capacity) {
                _capacity = new_capacity;
-               _data = realloc(_data, (new_capacity * _unit_size) + sizeof(uint64_t));
+               _data.resize((new_capacity * _unit_size) + sizeof(uint64_t));
        }
 }
 
 uint64_t Snapshot::capacity() const
 {
        lock_guard<recursive_mutex> lock(_mutex);
-       return _capacity;
+       return _data.size();
 }
 
 void Snapshot::append_data(void *data, uint64_t samples)
@@ -86,7 +84,7 @@ void Snapshot::append_data(void *data, uint64_t samples)
                set_capacity(_sample_count + samples);
        }
 
-       memcpy((uint8_t*)_data + _sample_count * _unit_size,
+       memcpy((uint8_t*)_data.data() + _sample_count * _unit_size,
                data, samples * _unit_size);
        _sample_count += samples;
 }
index 499164400014d20001ae1e130c177bfcefe990be..e4b9c0e812aaf7a7e0b3722d26a352997d02180b 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <thread>
 #include <mutex>
+#include <vector>
 
 namespace pv {
 namespace data {
@@ -72,7 +73,7 @@ protected:
 
 protected:
        mutable std::recursive_mutex _mutex;
-       void *_data;
+       std::vector<uint8_t> _data;
        uint64_t _sample_count;
        uint64_t _capacity;
        int _unit_size;