X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fdemo%2Fdemo.c;h=73fe092727f604423c21afdbd520023cd7eab799;hb=d2e0b1fa71b90faf1f7e77b72627868baf5e9135;hp=a6e18d0769574a867a62b9e1b725add14ee5641d;hpb=a76842947faadad98572f011cb20f3220998f71b;p=libsigrok.git diff --git a/hardware/demo/demo.c b/hardware/demo/demo.c index a6e18d07..73fe0927 100644 --- a/hardware/demo/demo.c +++ b/hardware/demo/demo.c @@ -172,8 +172,8 @@ static GSList *hw_scan(GSList *options) sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, DEMONAME, NULL, NULL); if (!sdi) { - sr_err("%s: sr_dev_inst_new failed", __func__); - return 0; + sr_err("Device instance creation failed."); + return NULL; } sdi->driver = di; @@ -187,10 +187,9 @@ static GSList *hw_scan(GSList *options) devices = g_slist_append(devices, sdi); drvc->instances = g_slist_append(drvc->instances, sdi); - /* TODO: 'devc' is never g_free()'d? */ if (!(devc = g_try_malloc(sizeof(struct dev_context)))) { - sr_err("%s: devc malloc failed", __func__); - return SR_ERR_MALLOC; + sr_err("Device context malloc failed."); + return NULL; } devc->sdi = sdi; @@ -229,8 +228,28 @@ static int hw_dev_close(struct sr_dev_inst *sdi) static int hw_cleanup(void) { - /* Nothing needed so far. */ - return SR_OK; + GSList *l; + struct sr_dev_inst *sdi; + struct drv_context *drvc; + int ret = SR_OK; + + if (!(drvc = di->priv)) + return SR_OK; + + /* Properly close and free all devices. */ + for (l = drvc->instances; l; l = l->next) { + if (!(sdi = l->data)) { + /* Log error, but continue cleaning up the rest. */ + sr_err("%s: sdi was NULL, continuing", __func__); + ret = SR_ERR_BUG; + continue; + } + sr_dev_inst_free(sdi); + } + g_slist_free(drvc->instances); + drvc->instances = NULL; + + return ret; } static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi) @@ -267,7 +286,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi) } break; default: - return SR_ERR_ARG; + return SR_ERR_NA; } return SR_OK; @@ -316,7 +335,7 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi) sr_dbg("%s: setting pattern to %d", __func__, devc->sample_generator); } else { - ret = SR_ERR; + ret = SR_ERR_NA; } return ret; @@ -345,7 +364,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) *data = g_variant_new_strv(pattern_strings, ARRAY_SIZE(pattern_strings)); break; default: - return SR_ERR_ARG; + return SR_ERR_NA; } return SR_OK; @@ -490,6 +509,8 @@ static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) sr_session_source_remove_channel(devc->channel); g_io_channel_shutdown(devc->channel, FALSE, NULL); + g_io_channel_unref(devc->channel); + devc->channel = NULL; /* Send last packet. */ packet.type = SR_DF_END;