The session and demo device code contain a hack to make the demo device work on
Windows. This was neccessary since polling on windows requires special handling
and we can not just pass in the raw fd to poll.

With the previous patches which added support for non-fd based event sources
this hack is no longer required. The patch moves the GIOChannels used by the
demo device to the demo device context and uses sr_session_source_add_channel
to register a source for the channels instead of using the raw pipe fds.

Signed-off-by: Lars-Peter Clausen <[email protected]>
---
 libsigrok/hardware/demo/demo.c |   29 +++++++++++++++--------------
 libsigrok/session.c            |    8 --------
 2 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/libsigrok/hardware/demo/demo.c b/libsigrok/hardware/demo/demo.c
index e511c0a..90ea666 100644
--- a/libsigrok/hardware/demo/demo.c
+++ b/libsigrok/hardware/demo/demo.c
@@ -64,10 +64,10 @@ enum {
 };
 
 /* FIXME: Should not be global. */
-SR_PRIV GIOChannel *channels[2];
 
 struct context {
        int pipe_fds[2];
+       GIOChannel *channels[2];
        uint8_t sample_generator;
        uint8_t thread_running;
        uint64_t samples_counter;
@@ -352,7 +352,7 @@ static void thread_func(void *data)
                        samples_generator(buf, nb_to_send, data);
                        ctx->samples_counter += nb_to_send;
 
-                       g_io_channel_write_chars(channels[1], (gchar *)&buf,
+                       g_io_channel_write_chars(ctx->channels[1], (gchar 
*)&buf,
                                nb_to_send, (gsize *)&bytes_written, NULL);
                }
 
@@ -371,6 +371,7 @@ static void thread_func(void *data)
 /* Callback handling data */
 static int receive_data(int fd, int revents, void *cb_data)
 {
+       struct context *ctx = cb_data;
        struct sr_datafeed_packet packet;
        struct sr_datafeed_logic logic;
        static uint64_t samples_received = 0;
@@ -382,7 +383,7 @@ static int receive_data(int fd, int revents, void *cb_data)
        (void)revents;
 
        do {
-               g_io_channel_read_chars(channels[0],
+               g_io_channel_read_chars(ctx->channels[0],
                                        (gchar *)&c, BUFSIZE, &z, NULL);
 
                if (z > 0) {
@@ -391,18 +392,18 @@ static int receive_data(int fd, int revents, void 
*cb_data)
                        logic.length = z;
                        logic.unitsize = 1;
                        logic.data = c;
-                       sr_session_send(cb_data, &packet);
+                       sr_session_send(ctx->session_dev_id, &packet);
                        samples_received += z;
                }
        } while (z > 0);
 
        if (!thread_running && z <= 0) {
                /* Make sure we don't receive more packets. */
-               g_io_channel_shutdown(channels[0], FALSE, NULL);
+               g_io_channel_shutdown(ctx->channels[0], FALSE, NULL);
 
                /* Send last packet. */
                packet.type = SR_DF_END;
-               sr_session_send(cb_data, &packet);
+               sr_session_send(ctx->session_dev_id, &packet);
 
                return FALSE;
        }
@@ -434,19 +435,19 @@ static int hw_dev_acquisition_start(int dev_index, void 
*cb_data)
                return SR_ERR;
        }
 
-       channels[0] = g_io_channel_unix_new(ctx->pipe_fds[0]);
-       channels[1] = g_io_channel_unix_new(ctx->pipe_fds[1]);
+       ctx->channels[0] = g_io_channel_unix_new(ctx->pipe_fds[0]);
+       ctx->channels[1] = g_io_channel_unix_new(ctx->pipe_fds[1]);
 
        /* Set channel encoding to binary (default is UTF-8). */
-       g_io_channel_set_encoding(channels[0], NULL, NULL);
-       g_io_channel_set_encoding(channels[1], NULL, NULL);
+       g_io_channel_set_encoding(ctx->channels[0], NULL, NULL);
+       g_io_channel_set_encoding(ctx->channels[1], NULL, NULL);
 
        /* Make channels to unbuffered. */
-       g_io_channel_set_buffered(channels[0], FALSE);
-       g_io_channel_set_buffered(channels[1], FALSE);
+       g_io_channel_set_buffered(ctx->channels[0], FALSE);
+       g_io_channel_set_buffered(ctx->channels[1], FALSE);
 
-       sr_source_add(ctx->pipe_fds[0], G_IO_IN | G_IO_ERR, 40,
-                     receive_data, ctx->session_dev_id);
+       sr_session_source_add_channel(ctx->channels[0], G_IO_IN | G_IO_ERR,
+                   40, receive_data, ctx);
 
        /* Run the demo thread. */
        g_thread_init(NULL);
diff --git a/libsigrok/session.c b/libsigrok/session.c
index 98df05c..3a7ef9a 100644
--- a/libsigrok/session.c
+++ b/libsigrok/session.c
@@ -25,9 +25,6 @@
 #include "sigrok.h"
 #include "sigrok-internal.h"
 
-/* demo.c. TODO: Should not be global! */
-extern SR_PRIV GIOChannel channels[2];
-
 struct source {
        int timeout;
        sr_receive_data_callback_t cb;
@@ -522,13 +519,8 @@ SR_API int sr_session_source_add(int fd, int events, int 
timeout,
 {
        GPollFD p;
 
-#ifdef _WIN32
-       g_io_channel_win32_make_pollfd(&channels[0],
-                       events, &p);
-#else
        p.fd = fd;
        p.events = events;
-#endif
 
        return _sr_session_source_add(&p, timeout, cb, cb_data, (gintptr)fd);
 }
-- 
1.7.10


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
sigrok-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to