]> sigrok.org Git - pulseview.git/blobdiff - pv/logicdatasnapshot.cpp
Made LogicDataSnapshot::get_sample private rather than mutex protecting it
[pulseview.git] / pv / logicdatasnapshot.cpp
index 2b3e8cae7c06b4e8c3e125a941d2d2cb865c5f4c..b264980b3078271801a0ad808a737af6ffe859fb 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "logicdatasnapshot.h"
 
+using namespace boost;
 using namespace std;
 
 namespace pv {
@@ -43,12 +44,14 @@ LogicDataSnapshot::LogicDataSnapshot(
        DataSnapshot(logic.unitsize),
        _last_append_sample(0)
 {
+       lock_guard<recursive_mutex> lock(_mutex);
        memset(_mip_map, 0, sizeof(_mip_map));
        append_payload(logic);
 }
 
 LogicDataSnapshot::~LogicDataSnapshot()
 {
+       lock_guard<recursive_mutex> lock(_mutex);
        BOOST_FOREACH(MipMapLevel &l, _mip_map)
                free(l.data);
 }
@@ -58,6 +61,8 @@ void LogicDataSnapshot::append_payload(
 {
        assert(_unit_size == logic.unitsize);
 
+       lock_guard<recursive_mutex> lock(_mutex);
+
        append_data(logic.data, logic.length);
 
        // Generate the first mip-map from the data
@@ -121,7 +126,7 @@ void LogicDataSnapshot::append_payload_to_mipmap()
        }
 
        // Compute higher level mipmaps
-       for(int level = 1; level < ScaleStepCount; level++)
+       for(unsigned int level = 1; level < ScaleStepCount; level++)
        {
                MipMapLevel &m = _mip_map[level];
                const MipMapLevel &ml = _mip_map[level-1];
@@ -169,11 +174,11 @@ uint64_t LogicDataSnapshot::get_sample(uint64_t index) const
 
 void LogicDataSnapshot::get_subsampled_edges(
        std::vector<EdgePair> &edges,
-       int64_t start, int64_t end,
+       uint64_t start, uint64_t end,
        float min_length, int sig_index)
 {
-       int64_t index = start;
-       int level;
+       uint64_t index = start;
+       unsigned int level;
        bool last_sample;
        bool fast_forward;
 
@@ -184,8 +189,10 @@ void LogicDataSnapshot::get_subsampled_edges(
        assert(sig_index >= 0);
        assert(sig_index < SR_MAX_NUM_PROBES);
 
-       const int64_t block_length = (int64_t)max(min_length, 1.0f);
-       const int min_level = max((int)floorf(logf(min_length) /
+       lock_guard<recursive_mutex> lock(_mutex);
+
+       const uint64_t block_length = (uint64_t)max(min_length, 1.0f);
+       const unsigned int min_level = max((int)floorf(logf(min_length) /
                LogMipMapScaleFactor) - 1, 0);
        const uint64_t sig_mask = 1ULL << sig_index;
 
@@ -206,8 +213,7 @@ void LogicDataSnapshot::get_subsampled_edges(
                        const uint64_t final_index = min(end,
                                pow2_ceil(index, MipMapScalePower));
 
-                       for(index;
-                               index < final_index &&
+                       for(; index < final_index &&
                                (index & ~(~0 << MipMapScalePower)) != 0;
                                index++)
                        {
@@ -312,7 +318,7 @@ void LogicDataSnapshot::get_subsampled_edges(
                        // do a linear search for the next transition within the
                        // block
                        if(min_length < MipMapScaleFactor) {
-                               for(index; index < end; index++) {
+                               for(; index < end; index++) {
                                        const bool sample = (get_sample(index) &
                                                sig_mask) != 0;
                                        if(sample != last_sample)
@@ -350,10 +356,10 @@ uint64_t LogicDataSnapshot::get_subsample(int level, uint64_t offset) const
                _unit_size * offset);
 }
 
-int64_t LogicDataSnapshot::pow2_ceil(int64_t x, unsigned int power)
+uint64_t LogicDataSnapshot::pow2_ceil(uint64_t x, unsigned int power)
 {
-       const int64_t p = 1 << power;
-       return ((x < 0) ? x : (x + p - 1)) / p * p;
+       const uint64_t p = 1 << power;
+       return (x + p - 1) / p * p;
 }
 
 } // namespace pv