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);
sr_strerror(ret));
return ret;
}
- if ((ret = sdi->driver->dev_acquisition_start(sdi,
- sdi)) != SR_OK) {
+ if ((ret = sdi->driver->dev_acquisition_start(sdi)) != SR_OK) {
sr_err("Failed to start acquisition of device in "
"running session (%s)", sr_strerror(ret));
return ret;
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.
*
/* Have all devices start acquisition. */
for (l = session->devs; l; l = l->next) {
- sdi = l->data;
- ret = sdi->driver->dev_acquisition_start(sdi, sdi);
+ if (!(sdi = l->data)) {
+ sr_err("Device sdi was NULL, can't start session.");
+ ret = SR_ERR;
+ break;
+ }
+ ret = sdi->driver->dev_acquisition_start(sdi);
if (ret != SR_OK) {
sr_err("Could not start %s device %s acquisition.",
sdi->driver->name, sdi->connection_id);
for (l = session->devs; l != lend; l = l->next) {
sdi = l->data;
if (sdi->driver->dev_acquisition_stop)
- sdi->driver->dev_acquisition_stop(sdi, sdi);
+ sdi->driver->dev_acquisition_stop(sdi);
}
/* TODO: Handle delayed stops. Need to iterate the event
* sources... */
for (node = session->devs; node; node = node->next) {
sdi = node->data;
if (sdi->driver && sdi->driver->dev_acquisition_stop)
- sdi->driver->dev_acquisition_stop(sdi, sdi);
+ sdi->driver->dev_acquisition_stop(sdi);
}
return G_SOURCE_REMOVE;
break;
case SR_DF_LOGIC:
logic = packet->payload;
- logic_copy = g_malloc(sizeof(logic));
+ logic_copy = g_malloc(sizeof(*logic_copy));
logic_copy->length = logic->length;
logic_copy->unitsize = logic->unitsize;
memcpy(logic_copy->data, logic->data, logic->length * logic->unitsize);
break;
case SR_DF_ANALOG_OLD:
analog_old = packet->payload;
- analog_old_copy = g_malloc(sizeof(analog_old));
+ analog_old_copy = g_malloc(sizeof(*analog_old_copy));
analog_old_copy->channels = g_slist_copy(analog_old->channels);
analog_old_copy->num_samples = analog_old->num_samples;
analog_old_copy->mq = analog_old->mq;
break;
case SR_DF_ANALOG:
analog = packet->payload;
- analog_copy = g_malloc(sizeof(analog));
+ analog_copy = g_malloc(sizeof(*analog_copy));
analog_copy->data = g_malloc(
analog->encoding->unitsize * analog->num_samples);
memcpy(analog_copy->data, analog->data,