]> sigrok.org Git - libsigrok.git/commitdiff
better cleanup of device/plugin resources
authorBert Vermeulen <redacted>
Mon, 4 Apr 2011 03:13:29 +0000 (05:13 +0200)
committerBert Vermeulen <redacted>
Sat, 4 Jun 2011 23:51:49 +0000 (01:51 +0200)
backend.c
device.c
hardware/openbench-logic-sniffer/ols.c
hwplugin.c
session.c
sigrok-proto.h

index b52766474d0d98eb929e5722aee1b8b4dd29f4f5..c3c3087a9d11315a28744db990cc6da4bf31f7f2 100644 (file)
--- 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;
 }
index fea3d60bedfc235f87e59f5d5f6ba958a897892c..6921ceb0fad60243a8eae13e06adfc2434af4167 100644 (file)
--- 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;
index e3620485315cb99e6bdfe21e5b611920f88185da..e9f0c2d34aa49808cbff9cdb179f161c44c05bec 100644 (file)
@@ -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)
index 412cf2d68ab5b34e22f70a36543b61d75afd13a6..33ff79d92779bbefa768541eb0f70b0ca533104f 100644 (file)
@@ -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
index b80ab7d59f489ff4bcd3e87918a2e3454b2ee806..632ac9467763a5d3dbe042a00fa1a579a225c1d9 100644 (file)
--- 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. */
index fce35c094b249675a849a7ef5f5bb7ce664cd724..ad7068e5b1a7d1b32a9eae79434a3444bba94e8b 100644 (file)
@@ -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,