]> sigrok.org Git - libsigrok.git/commitdiff
session.c: Remove all remaining sources on sr_session_stop
authorAlexandru Gagniuc <redacted>
Wed, 19 Dec 2012 10:15:18 +0000 (04:15 -0600)
committerBert Vermeulen <redacted>
Mon, 24 Dec 2012 19:24:13 +0000 (20:24 +0100)
Some sources may not be necessarily associated with a device. The best example
is the anykey pollfd from sigrok-cli. sr_session_stop only removes sources
associated with hardware devices via dev_acquisition_stop. Sources such as
anykey are not removed, and thus session->num_sources will not get to 0. As a
result, we may get into situations where the event loop enters an infinite
state.

To prevent this, all we have to do is remove any active sources that are still
present after dev_acquisition_stop has been called for all devices.

This fixes bug 14.

session.c

index 6a4a3c99704b4e2c5f371911594c685a9417ed06..9f8a4df797728e401aa7b5e42fe54408b003f945 100644 (file)
--- a/session.c
+++ b/session.c
@@ -362,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;
 }