pulseview/0012-Fix-181-by-changing-th...

79 lines
2.5 KiB
Diff

From a1a3656b4e18cb9fc078a51bf4256066ee307620 Mon Sep 17 00:00:00 2001
From: Soeren Apel <soeren@apelpie.net>
Date: Tue, 9 Feb 2016 14:48:31 +0100
Subject: [PATCH 12/13] 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.
---
pv/data/decoderstack.cpp | 6 ++++--
pv/data/decoderstack.hpp | 8 ++++----
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/pv/data/decoderstack.cpp b/pv/data/decoderstack.cpp
index 51d4bae..5935473 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<mutex> 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<mutex> 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 64ce13b..e2bf1bd 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<decode::Decoder> > stack_;
--
2.4.3