]> sigrok.org Git - libsigrok.git/blobdiff - src/session.c
sr_session_trigger_{get,set}: Document, add error checks.
[libsigrok.git] / src / session.c
index 11da1378b56508c67c804d66bbb3169f429ea7ad..f7d3bc8abfbd55539b5efc707d1dab5331850474 100644 (file)
@@ -113,6 +113,8 @@ SR_API int sr_session_destroy(struct sr_session *session)
        if (session->trigger)
                sr_trigger_free(session->trigger);
 
+       g_slist_free_full(session->owned_devs, (GDestroyNotify)sr_dev_inst_free);
+
        g_free(session);
 
        return SR_OK;
@@ -304,9 +306,7 @@ SR_API int sr_session_datafeed_callback_add(struct sr_session *session,
                return SR_ERR_ARG;
        }
 
-       if (!(cb_struct = g_try_malloc0(sizeof(struct datafeed_callback))))
-               return SR_ERR_MALLOC;
-
+       cb_struct = g_malloc0(sizeof(struct datafeed_callback));
        cb_struct->cb = cb;
        cb_struct->cb_data = cb_data;
 
@@ -316,13 +316,40 @@ SR_API int sr_session_datafeed_callback_add(struct sr_session *session,
        return SR_OK;
 }
 
+/**
+ * Get the trigger assigned to this session.
+ *
+ * @param session The session to use.
+ *
+ * @retval NULL Invalid (NULL) session was passed to the function.
+ * @retval other The trigger assigned to this session (can be NULL).
+ *
+ * @since 0.4.0
+ */
 SR_API struct sr_trigger *sr_session_trigger_get(struct sr_session *session)
 {
+       if (!session)
+               return NULL;
+
        return session->trigger;
 }
 
+/**
+ * Set the trigger of this session.
+ *
+ * @param session The session to use. Must not be NULL.
+ * @param trig The trigger to assign to this session. Can be NULL.
+ *
+ * @retval SR_OK Success.
+ * @retval SR_ERR_ARG Invalid argument.
+ *
+ * @since 0.4.0
+ */
 SR_API int sr_session_trigger_set(struct sr_session *session, struct sr_trigger *trig)
 {
+       if (!session)
+               return SR_ERR_ARG;
+
        session->trigger = trig;
 
        return SR_OK;
@@ -385,7 +412,6 @@ static int sr_session_iteration(struct sr_session *session, gboolean block)
        return SR_OK;
 }
 
-
 static int verify_trigger(struct sr_trigger *trigger)
 {
        struct sr_trigger_stage *stage;
@@ -611,6 +637,7 @@ static void datafeed_dump(const struct sr_datafeed_packet *packet)
 {
        const struct sr_datafeed_logic *logic;
        const struct sr_datafeed_analog *analog;
+       const struct sr_datafeed_analog2 *analog2;
 
        switch (packet->type) {
        case SR_DF_HEADER:
@@ -632,6 +659,11 @@ static void datafeed_dump(const struct sr_datafeed_packet *packet)
                sr_dbg("bus: Received SR_DF_ANALOG packet (%d samples).",
                       analog->num_samples);
                break;
+       case SR_DF_ANALOG2:
+               analog2 = packet->payload;
+               sr_dbg("bus: Received SR_DF_ANALOG2 packet (%d samples).",
+                      analog2->num_samples);
+               break;
        case SR_DF_END:
                sr_dbg("bus: Received SR_DF_END packet.");
                break;
@@ -704,7 +736,6 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
  *
  * @retval SR_OK Success.
  * @retval SR_ERR_ARG Invalid argument.
- * @retval SR_ERR_MALLOC Memory allocation error.
  */
 static int _sr_session_source_add(struct sr_session *session, GPollFD *pollfd,
                int timeout, sr_receive_data_callback cb, void *cb_data, gintptr poll_object)
@@ -719,19 +750,10 @@ static int _sr_session_source_add(struct sr_session *session, GPollFD *pollfd,
 
        /* Note: cb_data can be NULL, that's not a bug. */
 
-       new_pollfds = g_try_realloc(session->pollfds,
+       new_pollfds = g_realloc(session->pollfds,
                        sizeof(GPollFD) * (session->num_sources + 1));
-       if (!new_pollfds) {
-               sr_err("%s: new_pollfds malloc failed", __func__);
-               return SR_ERR_MALLOC;
-       }
-
-       new_sources = g_try_realloc(session->sources, sizeof(struct source) *
+       new_sources = g_realloc(session->sources, sizeof(struct source) *
                        (session->num_sources + 1));
-       if (!new_sources) {
-               sr_err("%s: new_sources malloc failed", __func__);
-               return SR_ERR_MALLOC;
-       }
 
        new_pollfds[session->num_sources] = *pollfd;
        s = &new_sources[session->num_sources++];
@@ -761,7 +783,6 @@ static int _sr_session_source_add(struct sr_session *session, GPollFD *pollfd,
  *
  * @retval SR_OK Success.
  * @retval SR_ERR_ARG Invalid argument.
- * @retval SR_ERR_MALLOC Memory allocation error.
  *
  * @since 0.3.0
  */
@@ -787,7 +808,6 @@ SR_API int sr_session_source_add(struct sr_session *session, int fd,
  *
  * @retval SR_OK Success.
  * @retval SR_ERR_ARG Invalid argument.
- * @retval SR_ERR_MALLOC Memory allocation error.
  *
  * @since 0.3.0
  */
@@ -811,7 +831,6 @@ SR_API int sr_session_source_add_pollfd(struct sr_session *session,
  *
  * @retval SR_OK Success.
  * @retval SR_ERR_ARG Invalid argument.
- * @retval SR_ERR_MALLOC Memory allocation error.
  *
  * @since 0.3.0
  */
@@ -834,20 +853,15 @@ SR_API int sr_session_source_add_channel(struct sr_session *session,
 /**
  * Remove the source belonging to the specified channel.
  *
- * @todo Add more error checks and logging.
- *
  * @param session The session to use. Must not be NULL.
  * @param poll_object The channel for which the source should be removed.
  *
  * @retval SR_OK Success
  * @retval SR_ERR_ARG Invalid arguments
- * @retval SR_ERR_MALLOC Memory allocation error
  * @retval SR_ERR_BUG Internal error
  */
 static int _sr_session_source_remove(struct sr_session *session, gintptr poll_object)
 {
-       struct source *new_sources;
-       GPollFD *new_pollfds;
        unsigned int old;
 
        if (!session->sources || !session->num_sources) {
@@ -864,29 +878,17 @@ static int _sr_session_source_remove(struct sr_session *session, gintptr poll_ob
        if (old == session->num_sources)
                return SR_OK;
 
-       session->num_sources -= 1;
+       session->num_sources--;
 
        if (old != session->num_sources) {
-               memmove(&session->pollfds[old], &session->pollfds[old+1],
+               memmove(&session->pollfds[old], &session->pollfds[old + 1],
                        (session->num_sources - old) * sizeof(GPollFD));
-               memmove(&session->sources[old], &session->sources[old+1],
+               memmove(&session->sources[old], &session->sources[old + 1],
                        (session->num_sources - old) * sizeof(struct source));
        }
 
-       new_pollfds = g_try_realloc(session->pollfds, sizeof(GPollFD) * session->num_sources);
-       if (!new_pollfds && session->num_sources > 0) {
-               sr_err("%s: new_pollfds malloc failed", __func__);
-               return SR_ERR_MALLOC;
-       }
-
-       new_sources = g_try_realloc(session->sources, sizeof(struct source) * session->num_sources);
-       if (!new_sources && session->num_sources > 0) {
-               sr_err("%s: new_sources malloc failed", __func__);
-               return SR_ERR_MALLOC;
-       }
-
-       session->pollfds = new_pollfds;
-       session->sources = new_sources;
+       session->pollfds = g_realloc(session->pollfds, sizeof(GPollFD) * session->num_sources);
+       session->sources = g_realloc(session->sources, sizeof(struct source) * session->num_sources);
 
        return SR_OK;
 }
@@ -899,7 +901,6 @@ static int _sr_session_source_remove(struct sr_session *session, gintptr poll_ob
  *
  * @retval SR_OK Success
  * @retval SR_ERR_ARG Invalid argument
- * @retval SR_ERR_MALLOC Memory allocation error.
  * @retval SR_ERR_BUG Internal error.
  *
  * @since 0.3.0
@@ -935,7 +936,6 @@ SR_API int sr_session_source_remove_pollfd(struct sr_session *session,
  *
  * @retval SR_OK Success.
  * @retval SR_ERR_ARG Invalid argument.
- * @retval SR_ERR_MALLOC Memory allocation error.
  * @return SR_ERR_BUG Internal error.
  *
  * @since 0.2.0