]> sigrok.org Git - pulseview.git/blobdiff - pv/data/logicsnapshot.cpp
Pad mip-map buffers to allow for uint64_t write word
[pulseview.git] / pv / data / logicsnapshot.cpp
index 03e6a54f2e7c097bb2909c9ad1ae1fbe671bbaf5..af6ac0e8c367a097372aeea376cef6c101785e8b 100644 (file)
@@ -60,10 +60,11 @@ void LogicSnapshot::append_payload(
        const sr_datafeed_logic &logic)
 {
        assert(_unit_size == logic.unitsize);
+       assert((logic.length % _unit_size) == 0);
 
        lock_guard<recursive_mutex> lock(_mutex);
 
-       append_data(logic.data, logic.length);
+       append_data(logic.data, logic.length / _unit_size);
 
        // Generate the first mip-map from the data
        append_payload_to_mipmap();
@@ -76,7 +77,10 @@ void LogicSnapshot::reallocate_mip_map(MipMapLevel &m)
        if (new_data_length > m.data_length)
        {
                m.data_length = new_data_length;
-               m.data = realloc(m.data, new_data_length * _unit_size);
+
+               // Padding is added to allow for the uint64_t write word
+               m.data = realloc(m.data, new_data_length * _unit_size +
+                       sizeof(uint64_t));
        }
 }
 
@@ -167,7 +171,7 @@ void LogicSnapshot::append_payload_to_mipmap()
 uint64_t LogicSnapshot::get_sample(uint64_t index) const
 {
        assert(_data);
-       assert(index >= 0 && index < _sample_count);
+       assert(index < _sample_count);
 
        return *(uint64_t*)((uint8_t*)_data + index * _unit_size);
 }
@@ -182,7 +186,6 @@ void LogicSnapshot::get_subsampled_edges(
        bool last_sample;
        bool fast_forward;
 
-       assert(start >= 0);
        assert(end <= get_sample_count());
        assert(start <= end);
        assert(min_length > 0);
@@ -204,7 +207,10 @@ void LogicSnapshot::get_subsampled_edges(
        {
                //----- Continue to search -----//
                level = min_level;
-               fast_forward = true;
+
+               // We cannot fast-forward if there is no mip-map data at
+               // at the minimum level.
+               fast_forward = (_mip_map[level].data != NULL);
 
                if (min_length < MipMapScaleFactor)
                {
@@ -241,7 +247,8 @@ void LogicSnapshot::get_subsampled_edges(
                        // We can fast forward only if there was no change
                        const bool sample =
                                (get_sample(index) & sig_mask) != 0;
-                       fast_forward = last_sample == sample;
+                       if (last_sample != sample)
+                               fast_forward = false;
                }
 
                if (fast_forward) {
@@ -258,7 +265,6 @@ void LogicSnapshot::get_subsampled_edges(
                                        (level + 1) * MipMapScalePower;
                                const uint64_t offset =
                                        index >> level_scale_power;
-                               assert(offset >= 0);
 
                                // Check if we reached the last block at this
                                // level, or if there was a change in this block
@@ -293,7 +299,6 @@ void LogicSnapshot::get_subsampled_edges(
                                        (level + 1) * MipMapScalePower;
                                const uint64_t offset =
                                        index >> level_scale_power;
-                               assert(offset >= 0);
 
                                // Check if we reached the last block at this
                                // level, or if there was a change in this block