better cleanup of device/plugin resources
This commit is contained in:
parent
896a19fd65
commit
8722c31e26
|
@ -38,7 +38,8 @@ int sr_init(void)
|
|||
*/
|
||||
int sr_exit(void)
|
||||
{
|
||||
sr_device_close_all();
|
||||
|
||||
sr_cleanup_hwplugins();
|
||||
|
||||
return SR_OK;
|
||||
}
|
||||
|
|
55
device.c
55
device.c
|
@ -26,6 +26,7 @@ extern struct sr_global *global;
|
|||
|
||||
GSList *devices = NULL;
|
||||
|
||||
|
||||
void sr_device_scan(void)
|
||||
{
|
||||
GSList *plugins, *l;
|
||||
|
@ -40,43 +41,11 @@ void sr_device_scan(void)
|
|||
*/
|
||||
for (l = plugins; l; l = l->next) {
|
||||
plugin = l->data;
|
||||
sr_device_plugin_init(plugin);
|
||||
sr_init_hwplugins(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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
|
@ -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)
|
||||
|
|
47
hwplugin.c
47
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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue