X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fsession.c;h=4aeddcc2c348c49fd97b3abe791e586efce40b7e;hb=8cccbac8da97397b61aa094c67e62ee922b628ed;hp=f9df6e1f440411e8081d9fbef5498c75ab54a7de;hpb=3393f185a5109832db68966a44b46204cc5c53c5;p=libsigrok.git diff --git a/src/session.c b/src/session.c index f9df6e1f..4aeddcc2 100644 --- a/src/session.c +++ b/src/session.c @@ -256,6 +256,8 @@ SR_API int sr_session_destroy(struct sr_session *session) sr_session_dev_remove_all(session); g_slist_free_full(session->owned_devs, (GDestroyNotify)sr_dev_inst_free); + sr_session_datafeed_callback_remove_all(session); + g_hash_table_unref(session->event_sources); g_mutex_clear(&session->main_mutex); @@ -403,6 +405,45 @@ SR_API int sr_session_dev_list(struct sr_session *session, GSList **devlist) return SR_OK; } +/** + * Remove a device instance from a session. + * + * @param session The session to remove from. Must not be NULL. + * @param sdi The device instance to remove from a session. Must not + * be NULL. Also, sdi->driver and sdi->driver->dev_open must + * not be NULL. + * + * @retval SR_OK Success. + * @retval SR_ERR_ARG Invalid argument. + * + * @since 0.4.0 + */ +SR_API int sr_session_dev_remove(struct sr_session *session, + struct sr_dev_inst *sdi) +{ + if (!sdi) { + sr_err("%s: sdi was NULL", __func__); + return SR_ERR_ARG; + } + + if (!session) { + sr_err("%s: session was NULL", __func__); + return SR_ERR_ARG; + } + + /* If sdi->session is not session, the device is not in this + * session. */ + if (sdi->session != session) { + sr_err("%s: not assigned to this session", __func__); + return SR_ERR_ARG; + } + + session->devs = g_slist_remove(session->devs, sdi); + sdi->session = NULL; + + return SR_OK; +} + /** * Remove all datafeed callbacks in a session. *