X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Flogicdatasnapshot.cpp;h=b264980b3078271801a0ad808a737af6ffe859fb;hp=347b7e2445d71678a94b3151d41e4ef6fdb8936d;hb=30fcfd9f5b348da5123f0a25c943e40209be95b1;hpb=51e77110d4316fd0106f8306f5e1f0523c5bf7d7 diff --git a/pv/logicdatasnapshot.cpp b/pv/logicdatasnapshot.cpp index 347b7e24..b264980b 100644 --- a/pv/logicdatasnapshot.cpp +++ b/pv/logicdatasnapshot.cpp @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "extdef.h" +#include #include #include @@ -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 lock(_mutex); memset(_mip_map, 0, sizeof(_mip_map)); append_payload(logic); } LogicDataSnapshot::~LogicDataSnapshot() { + lock_guard 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 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 &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 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