From: Soeren Apel Date: Tue, 9 Feb 2016 13:48:31 +0000 (+0100) Subject: Fix #181 by changing the global decode lock into an SRD lock X-Git-Tag: pulseview-0.4.0~341 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=a1a3656b4e18cb9fc078a51bf4256066ee307620;hp=cc10c40992278034a7d7648d34f19ff6743710db Fix #181 by changing the global decode lock into an SRD lock The global decode was insufficient insofar as it didn't prevent a newly started decode thread from interjecting its own decode operations. When this happens, something goes haywire somewhere and Python crashes. Until the underlying cause is fixed, this global SRD lock forces one decoder thread to finish before another one can start. While this is a bit inconvenient for wanting to decode as the acquisition is going on, it currently is the only working option. --- diff --git a/pv/data/decoderstack.cpp b/pv/data/decoderstack.cpp index 51d4bae0..59354735 100644 --- a/pv/data/decoderstack.cpp +++ b/pv/data/decoderstack.cpp @@ -57,7 +57,7 @@ const double DecoderStack::DecodeThreshold = 0.2; const int64_t DecoderStack::DecodeChunkLength = 4096; const unsigned int DecoderStack::DecodeNotifyPeriod = 65536; -mutex DecoderStack::global_decode_mutex_; +mutex DecoderStack::global_srd_mutex_; DecoderStack::DecoderStack(pv::Session &session, const srd_decoder *const dec) : @@ -312,7 +312,6 @@ void DecoderStack::decode_data( for (int64_t i = 0; !interrupt_ && i < sample_count; i += chunk_sample_count) { - lock_guard decode_lock(global_decode_mutex_); const int64_t chunk_end = min( i + chunk_sample_count, sample_count); @@ -344,6 +343,9 @@ void DecoderStack::decode_proc() assert(segment_); + // Prevent any other decode threads from accessing libsigrokdecode + lock_guard srd_lock(global_srd_mutex_); + // Create the session srd_session_new(&session); assert(session); diff --git a/pv/data/decoderstack.hpp b/pv/data/decoderstack.hpp index 64ce13b0..e2bf1bd9 100644 --- a/pv/data/decoderstack.hpp +++ b/pv/data/decoderstack.hpp @@ -140,12 +140,12 @@ private: double samplerate_; /** - * This mutex prevents more than one decode operation occuring - * concurrently. + * This mutex prevents more than one thread from accessing + * libsigrokdecode concurrently. * @todo A proper solution should be implemented to allow multiple - * decode operations. + * decode operations in parallel. */ - static std::mutex global_decode_mutex_; + static std::mutex global_srd_mutex_; std::list< std::shared_ptr > stack_;