]> sigrok.org Git - libsigrok.git/commitdiff
openbench-logic-sniffer: Avoid recreating event source
authorDaniel Elstner <redacted>
Sun, 1 Nov 2015 18:38:40 +0000 (19:38 +0100)
committerDaniel Elstner <redacted>
Sun, 1 Nov 2015 18:38:40 +0000 (19:38 +0100)
With the current driver API and the corresponding session event
handling, it is not possible to destroy and then re-create an
event source with the same key within the same main loop iteration.

The next generation driver API will fix this problem. But for now,
just change the driver to make do without that sort of thing. Also
increase the I/O timeout to 100 ms to be safer in the event of all
kind of delays the OS environment may induce.

This fixes bug #678.

src/hardware/openbench-logic-sniffer/api.c
src/hardware/openbench-logic-sniffer/protocol.c

index fe442ac60bd8c1abbd12c33e28c8f2ff3b2db2b2..ddd33e1482a3e4e2f6c3616bd432d98a7f4f827b 100644 (file)
@@ -573,7 +573,10 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi,
        /* Send header packet to the session bus. */
        std_session_send_df_header(cb_data, LOG_PREFIX);
 
-       serial_source_add(sdi->session, serial, G_IO_IN, -1,
+       /* If the device stops sending for longer than it takes to send a byte,
+        * that means it's finished. But wait at least 100 ms to be safe.
+        */
+       serial_source_add(sdi->session, serial, G_IO_IN, 100,
                        ols_receive_data, cb_data);
 
        return SR_OK;
index eb848cf9b8c4f5fe0e17bba769611aa62eb6f15a..6fb6b44fb087be9f3321f9d049c245d7854ae39d 100644 (file)
@@ -344,16 +344,12 @@ SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data)
        serial = sdi->conn;
        devc = sdi->priv;
 
+       if (devc->num_transfers == 0 && revents == 0) {
+               /* Ignore timeouts as long as we haven't received anything */
+               return TRUE;
+       }
+
        if (devc->num_transfers++ == 0) {
-               /*
-                * First time round, means the device started sending data,
-                * and will not stop until done. If it stops sending for
-                * longer than it takes to send a byte, that means it's
-                * finished. We'll double that to 30ms to be sure...
-                */
-               serial_source_remove(sdi->session, serial);
-               serial_source_add(sdi->session, serial, G_IO_IN, 30,
-                               ols_receive_data, cb_data);
                devc->raw_sample_buf = g_try_malloc(devc->limit_samples * 4);
                if (!devc->raw_sample_buf) {
                        sr_err("Sample buffer malloc failed.");