]> sigrok.org Git - libsigrok.git/commitdiff
hameg-hmo: Release enabled channels when acquisition start fails
authorGerhard Sittig <redacted>
Sun, 6 Nov 2016 11:08:02 +0000 (12:08 +0100)
committerUwe Hermann <redacted>
Sat, 7 Jan 2017 14:51:32 +0000 (15:51 +0100)
Commit db81fbb58261 made sure to release a potentially previously
allocated list of enabled channels before (re-)building the list in the
current invocation of acquisition start.

This commit frees the memory in the error path near the failed creation
already, which reduces the period of time where unused resources are
held, and eliminates a memory leak when acquisition is not stopped after
failed start.

Both approaches can coexist. Freeing an empty list is perfectly fine.

src/hardware/hameg-hmo/api.c

index fe32262d4e425cdac18322194da4ff696cffdf37..92f5ab673a96fa4d48f94c7509465b90dd513f37 100644 (file)
@@ -705,6 +705,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        struct sr_channel *ch;
        struct dev_context *devc;
        struct sr_scpi_dev_inst *scpi;
+       int ret;
 
        if (sdi->status != SR_ST_ACTIVE)
                return SR_ERR_DEV_CLOSED;
@@ -734,12 +735,14 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
 
        if (hmo_check_channels(devc->enabled_channels) != SR_OK) {
                sr_err("Invalid channel configuration specified!");
-               return SR_ERR_NA;
+               ret = SR_ERR_NA;
+               goto free_enabled;
        }
 
        if (hmo_setup_channels(sdi) != SR_OK) {
                sr_err("Failed to setup channel configuration!");
-               return SR_ERR;
+               ret = SR_ERR;
+               goto free_enabled;
        }
 
        sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 50,
@@ -750,6 +753,11 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        devc->current_channel = devc->enabled_channels;
 
        return hmo_request_data(sdi);
+
+free_enabled:
+       g_slist_free(devc->enabled_channels);
+       devc->enabled_channels = NULL;
+       return ret;
 }
 
 static int dev_acquisition_stop(struct sr_dev_inst *sdi)