]> sigrok.org Git - pulseview.git/commitdiff
Fix #181 by changing the global decode lock into an SRD lock
authorSoeren Apel <redacted>
Tue, 9 Feb 2016 13:48:31 +0000 (14:48 +0100)
committerUwe Hermann <redacted>
Thu, 11 Feb 2016 14:08:08 +0000 (15:08 +0100)
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
pv/data/decoderstack.hpp

index 51d4bae0483ec4ca2b1fb74abae54738f680bd0d..59354735d1e328ee6cdd8d23a717ec7763f6fce6 100644 (file)
@@ -57,7 +57,7 @@ const double DecoderStack::DecodeThreshold = 0.2;
 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) :
@@ -312,7 +312,6 @@ void DecoderStack::decode_data(
 
        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);
@@ -344,6 +343,9 @@ void DecoderStack::decode_proc()
 
        assert(segment_);
 
 
        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);
        // Create the session
        srd_session_new(&session);
        assert(session);
index 64ce13b01253398850cfa99a9921074090507980..e2bf1bd9283b1ed8c39f580f9de039915ffabd2e 100644 (file)
@@ -140,12 +140,12 @@ private:
        double samplerate_;
 
        /**
        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
         * @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_;
 
 
        std::list< std::shared_ptr<decode::Decoder> > stack_;