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.
const int64_t DecoderStack::DecodeChunkLength = 4096;
const unsigned int DecoderStack::DecodeNotifyPeriod = 65536;
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) :
DecoderStack::DecoderStack(pv::Session &session,
const srd_decoder *const dec) :
for (int64_t i = 0; !interrupt_ && i < sample_count;
i += chunk_sample_count) {
for (int64_t i = 0; !interrupt_ && i < sample_count;
i += chunk_sample_count) {
- lock_guard<mutex> decode_lock(global_decode_mutex_);
const int64_t chunk_end = min(
i + chunk_sample_count, sample_count);
const int64_t chunk_end = min(
i + chunk_sample_count, sample_count);
+ // Prevent any other decode threads from accessing libsigrokdecode
+ lock_guard<mutex> srd_lock(global_srd_mutex_);
+
// Create the session
srd_session_new(&session);
assert(session);
// Create the session
srd_session_new(&session);
assert(session);
- * 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
* @todo A proper solution should be implemented to allow multiple
+ * decode operations in parallel.
- static std::mutex global_decode_mutex_;
+ static std::mutex global_srd_mutex_;
std::list< std::shared_ptr<decode::Decoder> > stack_;
std::list< std::shared_ptr<decode::Decoder> > stack_;