summaryrefslogtreecommitdiff
path: root/instance.c
diff options
context:
space:
mode:
authorSoeren Apel <soeren@apelpie.net>2020-06-21 12:10:59 +0200
committerSoeren Apel <soeren@apelpie.net>2021-02-13 23:21:10 +0100
commit114adb4997b71e93267e3816710c8b019ae927c0 (patch)
tree9c9b51fe5188db63f7311a2dc6f4516909b42270 /instance.c
parentb8c8dc8a649ad0a76bccbfae7198cc9c8cb2ccda (diff)
downloadlibsigrokdecode-114adb4997b71e93267e3816710c8b019ae927c0.tar.gz
libsigrokdecode-114adb4997b71e93267e3816710c8b019ae927c0.zip
Implement basic flushing
Diffstat (limited to 'instance.c')
-rw-r--r--instance.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/instance.c b/instance.c
index 3608874..c30b46b 100644
--- a/instance.c
+++ b/instance.c
@@ -1234,12 +1234,53 @@ SRD_PRIV int srd_inst_decode(struct srd_decoder_inst *di,
g_cond_wait(&di->handled_all_samples_cond, &di->data_mutex);
g_mutex_unlock(&di->data_mutex);
+ /* Flush all PDs in the stack that can be flushed */
+ srd_inst_flush(di);
+
if (di->want_wait_terminate)
return SRD_ERR_TERM_REQ;
return SRD_OK;
}
+
+/**
+ * Flush all data that is pending, bottom decoder first up to the top of the stack.
+ *
+ * @param di The decoder instance to call. Must not be NULL.
+ *
+ * @return SRD_OK upon success, a (negative) error code otherwise.
+ *
+ * @private
+ */
+SRD_PRIV int srd_inst_flush(struct srd_decoder_inst *di)
+{
+ PyGILState_STATE gstate;
+ PyObject *py_ret;
+ GSList *l;
+ int ret;
+
+ if (!di)
+ return SRD_ERR_ARG;
+
+ gstate = PyGILState_Ensure();
+ if (PyObject_HasAttrString(di->py_inst, "flush")) {
+ srd_dbg("Calling flush() of instance %s", di->inst_id);
+ py_ret = PyObject_CallMethod(di->py_inst, "flush", NULL);
+ Py_XDECREF(py_ret);
+ }
+ PyGILState_Release(gstate);
+
+ /* Pass the "flush" request to all stacked decoders. */
+ for (l = di->next_di; l; l = l->next) {
+ ret = srd_inst_flush(l->data);
+ if (ret != SRD_OK)
+ return ret;
+ }
+
+ return di->decoder_state;
+}
+
/**
* Terminate current decoder work, prepare for re-use on new input data.
*