Add driver helper std_dev_clear()

This commit is contained in:
Bert Vermeulen 2013-04-16 17:53:21 +02:00
parent 9e2e98640a
commit 49f00e13f7
2 changed files with 54 additions and 0 deletions

View File

@ -136,6 +136,7 @@ SR_PRIV int std_hw_dev_acquisition_stop_serial(struct sr_dev_inst *sdi,
struct sr_serial_dev_inst *serial, const char *prefix); struct sr_serial_dev_inst *serial, const char *prefix);
SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi, SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi,
const char *prefix); const char *prefix);
SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver);
/*--- hardware/common/serial.c ----------------------------------------------*/ /*--- hardware/common/serial.c ----------------------------------------------*/

53
std.c
View File

@ -159,3 +159,56 @@ SR_PRIV int std_hw_dev_acquisition_stop_serial(struct sr_dev_inst *sdi,
return SR_OK; return SR_OK;
} }
/*
* 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.
*
* @return SR_OK on success.
*/
SR_PRIV int std_dev_clear(const struct sr_dev_driver *driver)
{
struct sr_dev_inst *sdi;
struct drv_context *drvc;
struct dev_context *devc;
GSList *l;
int ret;
drvc = driver->priv;
ret = SR_OK;
for (l = drvc->instances; l; l = l->next) {
/* Log errors, but continue cleaning up the rest. */
if (!(sdi = l->data)) {
ret = SR_ERR_BUG;
continue;
}
if (!(devc = sdi->priv)) {
ret = SR_ERR_BUG;
continue;
}
if (driver->dev_close)
driver->dev_close(sdi);
if (sdi->conn) {
if (sdi->inst_type == SR_INST_USB)
sr_usb_dev_inst_free(sdi->conn);
else if (sdi->inst_type == SR_INST_SERIAL)
sr_serial_dev_inst_free(sdi->conn);
}
sdi = l->data;
sr_dev_inst_free(sdi);
}
g_slist_free(drvc->instances);
drvc->instances = NULL;
return ret;
}