From ff4bf6bd8141b9e7518b7bf431e45beff671e764 Mon Sep 17 00:00:00 2001 From: Soeren Apel Date: Sun, 16 Aug 2015 14:25:55 +0200 Subject: [PATCH 1/1] Fix #622 by using the actual sample count per segment Currently, each segment is as big as the sample limit (in the bug report: 1G samples), wasting huge amounts of memory. --- pv/session.cpp | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/pv/session.cpp b/pv/session.cpp index 2bd3a054..56ac8997 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -471,6 +471,8 @@ void Session::feed_in_logic(shared_ptr logic) { lock_guard lock(data_mutex_); + const size_t sample_count = logic->data_length() / logic->unit_size(); + if (!logic_data_) { // The only reason logic_data_ would not have been created is @@ -484,14 +486,10 @@ void Session::feed_in_logic(shared_ptr logic) // This could be the first packet after a trigger set_capture_state(Running); - // Get sample limit. - const uint64_t sample_limit = device_->read_config( - ConfigKey::LIMIT_SAMPLES); - // Create a new data segment cur_logic_segment_ = shared_ptr( new data::LogicSegment( - logic, cur_samplerate_, sample_limit)); + logic, cur_samplerate_, sample_count)); logic_data_->push_segment(cur_logic_segment_); // @todo Putting this here means that only listeners querying @@ -535,26 +533,13 @@ void Session::feed_in_analog(shared_ptr analog) // in the sweep containing this segment. sweep_beginning = true; - // Get sample limit. - uint64_t sample_limit; - try { - assert(device_); - const std::shared_ptr device = - device_->device(); - assert(device); - sample_limit = VariantBase::cast_dynamic>( - device->config_get(ConfigKey::LIMIT_SAMPLES)).get(); - } catch (Error) { - sample_limit = 0; - } - // Create a segment, keep it in the maps of channels segment = shared_ptr( new data::AnalogSegment( - cur_samplerate_, sample_limit)); + cur_samplerate_, sample_count)); cur_analog_segments_[channel] = segment; - // Find the annalog data associated with the channel + // Find the analog data associated with the channel shared_ptr sig = dynamic_pointer_cast( signal_from_channel(channel)); -- 2.30.2