*/
int sr_exit(void)
{
- sr_device_close_all();
+
+ sr_cleanup_hwplugins();
return SR_OK;
}
GSList *devices = NULL;
+
void sr_device_scan(void)
{
GSList *plugins, *l;
*/
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)
{
unsigned int pnum;
- /* TODO: Plugin-specific clear call? */
-
if (!device->probes)
return;
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;
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)
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;
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
void sr_session_destroy(void)
{
+
g_slist_free(session->devices);
/* TODO: Loop over protocol decoders and free them. */
/*--- 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);
/*--- 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,