std: Fix memory leak, code cleanup

This commit is contained in:
Bert Vermeulen 2013-05-06 00:36:50 +02:00
parent 26aec7fdc4
commit 12a33563b9
1 changed files with 12 additions and 15 deletions

27
std.c
View File

@ -172,15 +172,18 @@ SR_PRIV int std_hw_dev_acquisition_stop_serial(struct sr_dev_inst *sdi,
* there cannot be freed. * there cannot be freed.
* *
* @param driver The driver which will have its instances released. * @param driver The driver which will have its instances released.
* @param clear_private If not NULL, this points to a function called
* with sdi->priv as argument. The function can then clear any device
* instance-specific resources kept there. It must also clear the struct
* pointed to by sdi->priv.
* *
* @return SR_OK on success. * @return SR_OK on success.
*/ */
SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver, SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver,
std_dev_clear_t clear_private) std_dev_clear_t clear_private)
{ {
struct sr_dev_inst *sdi;
struct drv_context *drvc; struct drv_context *drvc;
struct dev_context *devc; struct sr_dev_inst *sdi;
GSList *l; GSList *l;
int ret; int ret;
@ -190,31 +193,25 @@ SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver,
ret = SR_OK; ret = SR_OK;
for (l = drvc->instances; l; l = l->next) { for (l = drvc->instances; l; l = l->next) {
/* Log errors, but continue cleaning up the rest. */
if (!(sdi = l->data)) { if (!(sdi = l->data)) {
ret = SR_ERR_BUG; ret = SR_ERR_BUG;
continue; continue;
} }
if (!(devc = sdi->priv)) {
ret = SR_ERR_BUG;
continue;
}
if (driver->dev_close) if (driver->dev_close)
driver->dev_close(sdi); driver->dev_close(sdi);
if (sdi->conn) { if (sdi->conn) {
if (sdi->inst_type == SR_INST_USB) if (sdi->inst_type == SR_INST_SERIAL)
#if HAVE_LIBUSB_1_0
sr_usb_dev_inst_free(sdi->conn);
#else
;
#endif
else if (sdi->inst_type == SR_INST_SERIAL)
sr_serial_dev_inst_free(sdi->conn); sr_serial_dev_inst_free(sdi->conn);
#if HAVE_LIBUSB_1_0
else if (sdi->inst_type == SR_INST_USB)
sr_usb_dev_inst_free(sdi->conn);
#endif
} }
if (clear_private) if (clear_private)
clear_private(sdi->priv); clear_private(sdi->priv);
sdi = l->data; else
g_free(sdi->priv);
sr_dev_inst_free(sdi); sr_dev_inst_free(sdi);
} }