]> sigrok.org Git - libsigrokdecode.git/blobdiff - session.c
Random whitespace/cosmetic/consistency fixes.
[libsigrokdecode.git] / session.c
index 0c1ef8205634512f1d7de78a2e0d80f5ff2e271c..cec97cf727d6aea602899b1a6256d39ce86f484f 100644 (file)
--- a/session.c
+++ b/session.c
@@ -48,7 +48,6 @@ SRD_PRIV int max_session_id = -1;
 /** @private */
 SRD_PRIV int session_is_valid(struct srd_session *sess)
 {
-
        if (!sess || sess->session_id < 1)
                return SRD_ERR;
 
@@ -70,7 +69,6 @@ SRD_PRIV int session_is_valid(struct srd_session *sess)
  */
 SRD_API int srd_session_new(struct srd_session **sess)
 {
-
        if (!sess) {
                srd_err("Invalid session pointer.");
                return SRD_ERR_ARG;
@@ -297,6 +295,46 @@ SRD_API int srd_session_send(struct srd_session *sess,
        return SRD_OK;
 }
 
+/**
+ * Terminate currently executing decoders in a session, reset internal state.
+ *
+ * All decoder instances have their .wait() method terminated, which
+ * shall terminate .decode() as well. Afterwards the decoders' optional
+ * .reset() method gets executed.
+ *
+ * This routine allows callers to abort pending expensive operations,
+ * when they are no longer interested in the decoders' results. Note
+ * that the decoder state is lost and aborted work cannot resume.
+ *
+ * This routine also allows callers to re-use previously created decoder
+ * stacks to process new input data which is not related to previously
+ * processed input data. This avoids the necessity to re-construct the
+ * decoder stack.
+ *
+ * @param sess The session in which to terminate decoders.
+ * @return SRD_OK upon success, a (negative) error code otherwise.
+ *
+ * @since 0.6.0
+ */
+SRD_API int srd_session_terminate_reset(struct srd_session *sess)
+{
+       GSList *d;
+       int ret;
+
+       if (session_is_valid(sess) != SRD_OK) {
+               srd_err("Invalid session.");
+               return SRD_ERR_ARG;
+       }
+
+       for (d = sess->di_list; d; d = d->next) {
+               ret = srd_inst_terminate_reset(d->data);
+               if (ret != SRD_OK)
+                       return ret;
+       }
+
+       return SRD_OK;
+}
+
 /**
  * Destroy a decoding session.
  *