X-Git-Url: http://git.code-monkey.de/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=405e06e145b50ed15743af7e47892125c297613d;hp=05dc3428ab5ce8e9f2bcb964175b55fceb3557d2;hb=dda88657a1548ea510f2b4945ec86cdcc464a803;hpb=5a914348e8c95f92fd7c1c5988d563c5fb472aa2 diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index 05dc342..405e06e 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -151,6 +151,8 @@ void DecodeSignal::reset_decode(bool shutting_down) logic_mux_thread_.join(); } + resume_decode(); // Make sure the decode thread isn't blocked by pausing + class_rows_.clear(); current_segment_id_ = 0; segments_.clear(); @@ -258,6 +260,25 @@ void DecodeSignal::begin_decode() decode_thread_ = std::thread(&DecodeSignal::decode_proc, this); } +void DecodeSignal::pause_decode() +{ + decode_paused_ = true; +} + +void DecodeSignal::resume_decode() +{ + // Manual unlocking is done before notifying, to avoid waking up the + // waiting thread only to block again (see notify_one for details) + decode_pause_mutex_.unlock(); + decode_pause_cond_.notify_one(); + decode_paused_ = false; +} + +bool DecodeSignal::is_paused() const +{ + return decode_paused_; +} + QString DecodeSignal::error_message() const { lock_guard lock(output_mutex_); @@ -981,6 +1002,11 @@ void DecodeSignal::decode_data( // Notify the frontend that we processed some data and // possibly have new annotations as well new_annotations(); + + if (decode_paused_) { + unique_lock pause_wait_lock(decode_pause_mutex_); + decode_pause_cond_.wait(pause_wait_lock); + } } }