79 lines
2.5 KiB
Diff
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
|
|
|