From: Stefan BrĂ¼ns Date: Thu, 26 Nov 2015 02:07:47 +0000 (+0100) Subject: output/analog: track and free memory for float conversion buffer X-Git-Tag: libsigrok-0.4.0~93 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=2dbe445d55f0d7166bb481f4991e10bec4cd2789;p=libsigrok.git output/analog: track and free memory for float conversion buffer ==18779== 800,000 bytes in 196 blocks are definitely lost in loss record 29 of 29 ==18779== at 0x4C29110: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==18779== by 0x4E635C3: receive (analog.c:319) ==18779== by 0x40870B: datafeed_in (session.c:316) ==18779== by 0x4E59D4E: sr_session_send (session.c:1201) ==18779== by 0x4E59F8B: sr_session_send (session.c:1159) ==18779== by 0x4E62595: send_chunk (wav.c:234) ==18779== by 0x4E62A06: process_buffer (wav.c:290) ==18779== by 0x40954A: load_input_file_module (input.c:123) ==18779== by 0x4097AB: load_input_file (input.c:157) ==18779== by 0x40531E: main (main.c:288) --- diff --git a/src/output/analog.c b/src/output/analog.c index ed480ca0..59f2f0af 100644 --- a/src/output/analog.c +++ b/src/output/analog.c @@ -31,6 +31,7 @@ struct context { int num_enabled_channels; GPtrArray *channellist; int digits; + float *fdata; }; enum { @@ -64,6 +65,7 @@ static int init(struct sr_output *o, GHashTable *options) g_ptr_array_add(ctx->channellist, ch->name); ctx->num_enabled_channels++; } + ctx->fdata = NULL; return SR_OK; } @@ -316,9 +318,10 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p case SR_DF_ANALOG: analog = packet->payload; num_channels = g_slist_length(analog->meaning->channels); - if (!(fdata = g_try_malloc( + if (!(fdata = g_try_realloc(ctx->fdata, analog->num_samples * num_channels * sizeof(float)))) return SR_ERR_MALLOC; + ctx->fdata = fdata; if ((ret = sr_analog_to_float(analog, fdata)) != SR_OK) return ret; *out = g_string_sized_new(512); @@ -361,6 +364,7 @@ static int cleanup(struct sr_output *o) ctx = o->priv; g_ptr_array_free(ctx->channellist, 1); + g_free(ctx->fdata); g_free(ctx); o->priv = NULL;