]> sigrok.org Git - libsigrok.git/blobdiff - session.c
serial-dmm: Handle time-limited acquisition
[libsigrok.git] / session.c
index 0d4c13f725c14681b684f86d5aae0ebaa062065e..9f8a4df797728e401aa7b5e42fe54408b003f945 100644 (file)
--- a/session.c
+++ b/session.c
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
 
+/**
+ * @file
+ *
+ * Creating, using, or destroying libsigrok sessions.
+ */
+
 /**
  * @defgroup grp_session Session handling
  *
@@ -356,6 +362,15 @@ SR_API int sr_session_stop(void)
                }
        }
 
+       /*
+        * Some sources may not be necessarily associated with a device.
+        * Those sources may still be present even after stopping all devices.
+        * We need to make sure all sources are removed, or we risk running the
+        * session in an infinite loop.
+        */
+       while (session->num_sources)
+               sr_session_source_remove(session->sources[0].poll_object);
+
        return SR_OK;
 }
 
@@ -364,10 +379,10 @@ SR_API int sr_session_stop(void)
  *
  * @param packet The packet to show debugging information for.
  */
-static void datafeed_dump(struct sr_datafeed_packet *packet)
+static void datafeed_dump(const struct sr_datafeed_packet *packet)
 {
-       struct sr_datafeed_logic *logic;
-       struct sr_datafeed_analog *analog;
+       const struct sr_datafeed_logic *logic;
+       const struct sr_datafeed_analog *analog;
 
        switch (packet->type) {
        case SR_DF_HEADER:
@@ -420,7 +435,7 @@ static void datafeed_dump(struct sr_datafeed_packet *packet)
  * @private
  */
 SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
-                           struct sr_datafeed_packet *packet)
+                           const struct sr_datafeed_packet *packet)
 {
        GSList *l;
        sr_datafeed_callback_t cb;