From 1de4f1d0c61c0968f1d4ea41a1a0987a4083f668 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Thu, 18 May 2023 10:16:09 +0800 Subject: [PATCH] fix: Failed to load big dso file --- DSView/pv/data/dsosnapshot.cpp | 4 ++- libsigrok4DSL/session_driver.c | 63 +++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/DSView/pv/data/dsosnapshot.cpp b/DSView/pv/data/dsosnapshot.cpp index fa0957b0..a3fc6163 100644 --- a/DSView/pv/data/dsosnapshot.cpp +++ b/DSView/pv/data/dsosnapshot.cpp @@ -98,6 +98,7 @@ void DsoSnapshot::clear() free_envelop(); init_all(); _have_data = false; + _envelope_en = false; } void DsoSnapshot::free_data() @@ -141,7 +142,8 @@ void DsoSnapshot::first_payload(const sr_datafeed_dso &dso, uint64_t total_sampl if (total_sample_count != _total_sample_count || channel_num != _channel_num - || channel_changed){ + || channel_changed + || isFile){ std::lock_guard lock(_mutex); diff --git a/libsigrok4DSL/session_driver.c b/libsigrok4DSL/session_driver.c index 1e0cbd6c..49f50f9b 100644 --- a/libsigrok4DSL/session_driver.c +++ b/libsigrok4DSL/session_driver.c @@ -165,6 +165,8 @@ static const char *probeMapUnits[] = { "m/s", }; +static void free_temp_buffer(struct session_vdev *vdev); + static int trans_data(struct sr_dev_inst *sdi) { // translate for old format @@ -483,7 +485,7 @@ static int receive_data_logic_dso_v2(int fd, int revents, const struct sr_dev_in if (sdi->mode == LOGIC) vdev->packet_buffer->post_buf_len = 8 * chan_num * 1000; else - vdev->packet_buffer->post_buf_len = chan_num * 1000; + vdev->packet_buffer->post_buf_len = chan_num * 10000; vdev->packet_buffer->post_buf = g_try_malloc0(vdev->packet_buffer->post_buf_len + 1); if (vdev->packet_buffer->post_buf == NULL){ @@ -495,7 +497,10 @@ static int receive_data_logic_dso_v2(int fd, int revents, const struct sr_dev_in pack_buffer->post_len; pack_buffer->block_buf_len = 0; pack_buffer->block_data_len = 0; - pack_buffer->block_chan_read_pos = 0; + pack_buffer->block_chan_read_pos = 0; + + if (sdi->mode == DSO) + vdev->num_blocks = 1; // Only one data file. } pack_buffer = vdev->packet_buffer; @@ -650,7 +655,7 @@ static int receive_data_logic_dso_v2(int fd, int revents, const struct sr_dev_in dso.mqflags = SR_MQFLAG_AC; dso.num_samples = pack_buffer->post_len / chan_num; dso.data = pack_buffer->post_buf; - } + } // Send data back. ds_data_forward(sdi, &packet); @@ -663,6 +668,7 @@ static int receive_data_logic_dso_v2(int fd, int revents, const struct sr_dev_in ds_data_forward(sdi, &packet); sr_session_source_remove(-1); close_archive(vdev); + free_temp_buffer(vdev); } return TRUE; @@ -755,35 +761,44 @@ static int dev_open(struct sr_dev_inst *sdi) return SR_OK; } +static void free_temp_buffer(struct session_vdev *vdev) +{ + struct session_packet_buffer *pack_buf; + int i; + + assert(vdev); + + pack_buf = vdev->packet_buffer; + + if (pack_buf != NULL) + { + g_safe_free(pack_buf->post_buf); + + for (i = 0; i < SESSION_MAX_CHANNEL_COUNT; i++){ + if (pack_buf->block_bufs[i] != NULL){ + g_free(pack_buf->block_bufs[i]); + pack_buf->block_bufs[i] = NULL; + } + else{ + break; + } + } + } + + g_safe_free(vdev->packet_buffer); + g_safe_free(vdev->buf); + g_safe_free(vdev->logic_buf); +} + static int dev_close(struct sr_dev_inst *sdi) { struct session_vdev *vdev; - int i; - struct session_packet_buffer *pack_buf; if (sdi && sdi->priv) { vdev = sdi->priv; - - if (vdev->packet_buffer != NULL){ - pack_buf = vdev->packet_buffer; + free_temp_buffer(vdev); - g_safe_free(pack_buf->post_buf); - - for (i = 0; i < SESSION_MAX_CHANNEL_COUNT; i++){ - if (pack_buf->block_bufs[i] != NULL){ - g_free(pack_buf->block_bufs[i]); - pack_buf->block_bufs[i] = NULL; - } - else{ - break; - } - } - } - - g_safe_free(vdev->packet_buffer); - g_safe_free(vdev->buf); - g_safe_free(vdev->logic_buf); g_safe_free(sdi->priv); sdi->status = SR_ST_INACTIVE;