From: Joel Holdsworth Date: Sun, 14 Apr 2013 17:52:02 +0000 (+0100) Subject: demo: Free dev_contexts X-Git-Tag: dsupstream~152 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=ed20a42803c8b4e79b259ae03298dec88f2299f5;p=libsigrok.git demo: Free dev_contexts --- diff --git a/hardware/demo/demo.c b/hardware/demo/demo.c index a6e18d07..d2497d5a 100644 --- a/hardware/demo/demo.c +++ b/hardware/demo/demo.c @@ -187,7 +187,6 @@ 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; @@ -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)