X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fsession.cpp;h=6b7645bc7c7ef92e876e74076e062f7f532171c0;hp=e2b6dd7174a0bcdfcadef6ab0041454ab4a2a8c0;hb=cc9a7898ee7afc32e03dbcc991ed7ba722ed8f1b;hpb=86123e2e4711e67f2246998b7172413199f231f4 diff --git a/pv/session.cpp b/pv/session.cpp index e2b6dd71..6b7645bc 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -140,9 +140,24 @@ void Session::set_device(shared_ptr device) device_.reset(); - // Remove all traces + // Remove all stored data signals_.clear(); + { + shared_lock lock(signals_mutex_); + for (const shared_ptr d : all_signal_data_) + d->clear(); + } + all_signal_data_.clear(); + cur_logic_segment_.reset(); + + for (auto entry : cur_analog_segments_) { + shared_ptr(entry.first).reset(); + shared_ptr(entry.second).reset(); + } + + logic_data_.reset(); decode_traces_.clear(); + signals_changed(); device_ = std::move(device); @@ -196,8 +211,11 @@ void Session::start_capture(function error_handler) } // Clear signal data - for (const shared_ptr d : get_data()) - d->clear(); + { + shared_lock lock(signals_mutex_); + for (const shared_ptr d : all_signal_data_) + d->clear(); + } // Begin the session sampling_thread_ = std::thread( @@ -215,30 +233,20 @@ void Session::stop_capture() sampling_thread_.join(); } -set< shared_ptr > Session::get_data() const -{ - shared_lock lock(signals_mutex_); - set< shared_ptr > data; - for (const shared_ptr sig : signals_) { - assert(sig); - data.insert(sig->data()); - } - - return data; -} - double Session::get_samplerate() const { double samplerate = 0.0; - for (const shared_ptr d : get_data()) { - assert(d); - const vector< shared_ptr > segments = - d->segments(); - for (const shared_ptr &s : segments) - samplerate = std::max(samplerate, s->samplerate()); + { + shared_lock lock(signals_mutex_); + for (const shared_ptr d : all_signal_data_) { + assert(d); + const vector< shared_ptr > segments = + d->segments(); + for (const shared_ptr &s : segments) + samplerate = std::max(samplerate, s->samplerate()); + } } - // If there is no sample rate given we use samples as unit if (samplerate == 0.0) samplerate = 1.0; @@ -338,7 +346,11 @@ void Session::set_capture_state(capture_state state) void Session::update_signals() { - assert(device_); + if (!device_) { + signals_.clear(); + logic_data_.reset(); + return; + } lock_guard lock(data_mutex_); @@ -402,6 +414,7 @@ void Session::update_signals() new view::LogicSignal(*this, device_, channel, logic_data_)); + all_signal_data_.insert(logic_data_); break; case SR_CHANNEL_ANALOG: @@ -411,6 +424,7 @@ void Session::update_signals() signal = shared_ptr( new view::AnalogSignal( *this, channel, data)); + all_signal_data_.insert(data); break; } @@ -506,17 +520,20 @@ void Session::feed_in_trigger() // The channel containing most samples should be most accurate uint64_t sample_count = 0; - for (const shared_ptr d : get_data()) { - assert(d); - uint64_t temp_count = 0; - - const vector< shared_ptr > segments = - d->segments(); - for (const shared_ptr &s : segments) - temp_count += s->get_sample_count(); - - if (temp_count > sample_count) - sample_count = temp_count; + { + shared_lock lock(signals_mutex_); + for (const shared_ptr d : all_signal_data_) { + assert(d); + uint64_t temp_count = 0; + + const vector< shared_ptr > segments = + d->segments(); + for (const shared_ptr &s : segments) + temp_count += s->get_sample_count(); + + if (temp_count > sample_count) + sample_count = temp_count; + } } trigger_event(sample_count / get_samplerate());