]> sigrok.org Git - libsigrok.git/commitdiff
output/analog: track and free memory for float conversion buffer
authorStefan Brüns <redacted>
Thu, 26 Nov 2015 02:07:47 +0000 (03:07 +0100)
committerUwe Hermann <redacted>
Sun, 29 Nov 2015 00:13:58 +0000 (01:13 +0100)
==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)

src/output/analog.c

index ed480ca0335385af204804cad0f5d0003b228da6..59f2f0afab22330a71b9ca88024aa689ec6d2d59 100644 (file)
@@ -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;