static void scpi_usbtmc_free(void *priv) { struct usbtmc_scpi *uscpi = priv; struct sr_usbtmc_dev_inst *usbtmc = uscpi->usbtmc; g_free(uscpi); sr_usbtmc_dev_inst_free(usbtmc); }
/* * Standard driver dev_clear() helper. * * This function can be used to implement the dev_clear() driver API * callback. dev_close() is called before every sr_dev_inst is cleared. * * The only limitation is driver-specific device contexts (sdi->priv). * These are freed, but any dynamic allocation within structs stored * there cannot be freed. * * @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. */ SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver, std_dev_clear_t clear_private) { struct drv_context *drvc; struct sr_dev_inst *sdi; GSList *l; int ret; if (!(drvc = driver->priv)) /* Driver was never initialized, nothing to do. */ return SR_OK; ret = SR_OK; for (l = drvc->instances; l; l = l->next) { if (!(sdi = l->data)) { ret = SR_ERR_BUG; continue; } if (driver->dev_close) driver->dev_close(sdi); if (sdi->conn) { #if HAVE_LIBSERIALPORT if (sdi->inst_type == SR_INST_SERIAL) sr_serial_dev_inst_free(sdi->conn); #endif #if HAVE_LIBUSB_1_0 if (sdi->inst_type == SR_INST_USB) sr_usb_dev_inst_free(sdi->conn); #endif if (sdi->inst_type == SR_INST_USBTMC) sr_usbtmc_dev_inst_free(sdi->conn); } if (clear_private) clear_private(sdi->priv); else g_free(sdi->priv); sr_dev_inst_free(sdi); } g_slist_free(drvc->instances); drvc->instances = NULL; return ret; }