hameg-hmo: Release enabled channels when acquisition start fails

Commit db81fbb582 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.
This commit is contained in:
Gerhard Sittig 2016-11-06 12:08:02 +01:00 committed by Uwe Hermann
parent 2d224dbae7
commit 40a75c8e97
1 changed files with 10 additions and 2 deletions

View File

@ -705,6 +705,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
struct sr_channel *ch; struct sr_channel *ch;
struct dev_context *devc; struct dev_context *devc;
struct sr_scpi_dev_inst *scpi; struct sr_scpi_dev_inst *scpi;
int ret;
if (sdi->status != SR_ST_ACTIVE) if (sdi->status != SR_ST_ACTIVE)
return SR_ERR_DEV_CLOSED; 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) { if (hmo_check_channels(devc->enabled_channels) != SR_OK) {
sr_err("Invalid channel configuration specified!"); sr_err("Invalid channel configuration specified!");
return SR_ERR_NA; ret = SR_ERR_NA;
goto free_enabled;
} }
if (hmo_setup_channels(sdi) != SR_OK) { if (hmo_setup_channels(sdi) != SR_OK) {
sr_err("Failed to setup channel configuration!"); 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, 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; devc->current_channel = devc->enabled_channels;
return hmo_request_data(sdi); 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) static int dev_acquisition_stop(struct sr_dev_inst *sdi)