From: Bert Vermeulen Date: Mon, 4 Apr 2011 03:13:29 +0000 (+0200) Subject: better cleanup of device/plugin resources X-Git-Tag: libsigrok-0.1.0~249 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=8722c31e26ecebfc75035a566d4d72d07761ef14 better cleanup of device/plugin resources --- diff --git a/backend.c b/backend.c index b5276647..c3c3087a 100644 --- a/backend.c +++ b/backend.c @@ -38,7 +38,8 @@ int sr_init(void) */ int sr_exit(void) { - sr_device_close_all(); + + sr_cleanup_hwplugins(); return SR_OK; } diff --git a/device.c b/device.c index fea3d60b..6921ceb0 100644 --- a/device.c +++ b/device.c @@ -26,6 +26,7 @@ extern struct sr_global *global; GSList *devices = NULL; + void sr_device_scan(void) { GSList *plugins, *l; @@ -40,41 +41,9 @@ void sr_device_scan(void) */ for (l = plugins; l; l = l->next) { plugin = l->data; - sr_device_plugin_init(plugin); - } - -} - -int sr_device_plugin_init(struct sr_device_plugin *plugin) -{ - int num_devices, num_probes, i; - - sr_info("initializing %s plugin", plugin->name); - num_devices = plugin->init(NULL); - for (i = 0; i < num_devices; i++) { - num_probes = (int)plugin->get_device_info(i, SR_DI_NUM_PROBES); - sr_device_new(plugin, i, num_probes); + sr_init_hwplugins(plugin); } - return num_devices; -} - -void sr_device_close_all(void) -{ - int ret; - struct sr_device *device; - - while (devices) { - device = devices->data; - if (device->plugin && device->plugin->closedev) { - ret = device->plugin->closedev(device->plugin_index); - if (ret != SR_OK) { - sr_err("dev: %s: could not close device %d", - __func__, device->plugin_index); - } - } - sr_device_destroy(device); - } } GSList *sr_device_list(void) @@ -111,8 +80,6 @@ void sr_device_clear(struct sr_device *device) { unsigned int pnum; - /* TODO: Plugin-specific clear call? */ - if (!device->probes) return; @@ -120,24 +87,6 @@ void sr_device_clear(struct sr_device *device) sr_device_probe_clear(device, pnum); } -void sr_device_destroy(struct sr_device *device) -{ - unsigned int pnum; - - /* - * TODO: Plugin-specific destroy call, need to decrease refcount - * in plugin. - */ - - devices = g_slist_remove(devices, device); - if (device->probes) { - for (pnum = 1; pnum <= g_slist_length(device->probes); pnum++) - sr_device_probe_clear(device, pnum); - g_slist_free(device->probes); - } - g_free(device); -} - void sr_device_probe_clear(struct sr_device *device, int probenum) { struct sr_probe *p; diff --git a/hardware/openbench-logic-sniffer/ols.c b/hardware/openbench-logic-sniffer/ols.c index e3620485..e9f0c2d3 100644 --- a/hardware/openbench-logic-sniffer/ols.c +++ b/hardware/openbench-logic-sniffer/ols.c @@ -482,7 +482,7 @@ static void hw_cleanup(void) GSList *l; struct sr_device_instance *sdi; - /* Properly close all devices. */ + /* Properly close and free all devices. */ for (l = device_instances; l; l = l->next) { sdi = l->data; if (sdi->serial->fd != -1) diff --git a/hwplugin.c b/hwplugin.c index 412cf2d6..33ff79d9 100644 --- a/hwplugin.c +++ b/hwplugin.c @@ -107,20 +107,47 @@ GSList *sr_list_hwplugins(void) return plugins; } +int sr_init_hwplugins(struct sr_device_plugin *plugin) +{ + int num_devices, num_probes, i; + + g_message("initializing %s plugin", plugin->name); + num_devices = plugin->init(NULL); + for (i = 0; i < num_devices; i++) { + num_probes = (int)plugin->get_device_info(i, SR_DI_NUM_PROBES); + sr_device_new(plugin, i, num_probes); + } + + return num_devices; +} + +void sr_cleanup_hwplugins(void) +{ + struct sr_device_plugin *plugin; + GSList *l; + + for (l = plugins; l; l = l->next) { + plugin = l->data; + if (plugin->cleanup) + plugin->cleanup(); + } + +} + struct sr_device_instance *sr_device_instance_new(int index, int status, const char *vendor, const char *model, const char *version) { struct sr_device_instance *sdi; - if (!(sdi = malloc(sizeof(struct sr_device_instance)))) + if (!(sdi = g_malloc(sizeof(struct sr_device_instance)))) return NULL; sdi->index = index; sdi->status = status; sdi->instance_type = -1; - sdi->vendor = vendor ? strdup(vendor) : NULL; - sdi->model = model ? strdup(model) : strdup("(unknown)"); - sdi->version = version ? strdup(version) : NULL; + sdi->vendor = vendor ? g_strdup(vendor) : NULL; + sdi->model = model ? g_strdup(model) : NULL; + sdi->version = version ? g_strdup(version) : NULL; sdi->priv = NULL; sdi->usb = NULL; @@ -159,10 +186,14 @@ void sr_device_instance_free(struct sr_device_instance *sdi) break; } - free(sdi->vendor); - free(sdi->model); - free(sdi->version); - free(sdi); + if (sdi->priv) + g_free(sdi->priv); + + g_free(sdi->vendor); + g_free(sdi->model); + g_free(sdi->version); + g_free(sdi); + } #ifdef HAVE_LIBUSB_1_0 diff --git a/session.c b/session.c index b80ab7d5..632ac946 100644 --- a/session.c +++ b/session.c @@ -54,6 +54,7 @@ struct sr_session *sr_session_new(void) void sr_session_destroy(void) { + g_slist_free(session->devices); /* TODO: Loop over protocol decoders and free them. */ diff --git a/sigrok-proto.h b/sigrok-proto.h index fce35c09..ad7068e5 100644 --- a/sigrok-proto.h +++ b/sigrok-proto.h @@ -40,8 +40,7 @@ void sr_datastore_put(struct sr_datastore *ds, void *data, unsigned int length, /*--- device.c --------------------------------------------------------------*/ void sr_device_scan(void); -int sr_device_plugin_init(struct sr_device_plugin *plugin); -void sr_device_close_all(void); +int sr_init_hwplugins(struct sr_device_plugin *plugin); GSList *sr_device_list(void); struct sr_device *sr_device_new(struct sr_device_plugin *plugin, int plugin_index, int num_probes); @@ -68,6 +67,7 @@ int sr_filter_probes(int in_unitsize, int out_unitsize, int *probelist, /*--- hwplugin.c ------------------------------------------------------------*/ GSList *sr_list_hwplugins(void); +void sr_cleanup_hwplugins(void); /* Generic device instances */ struct sr_device_instance *sr_device_instance_new(int index,