]> sigrok.org Git - libsigrok.git/commitdiff
sr: session/demo: Remove Windows specific hack
authorLars-Peter Clausen <redacted>
Sat, 30 Jun 2012 18:54:45 +0000 (20:54 +0200)
committerUwe Hermann <redacted>
Wed, 4 Jul 2012 23:41:01 +0000 (01:41 +0200)
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 <redacted>
hardware/demo/demo.c
session.c

index 3a6ed9e494c7510a8eebddff6f6de486d226dac5..0cd23e3c9ae51bb962e1b5ed5409350f0261f9c2 100644 (file)
@@ -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;
@@ -354,7 +354,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);
                }
 
@@ -373,6 +373,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;
@@ -384,7 +385,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) {
@@ -393,18 +394,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;
        }
@@ -436,19 +437,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);
index d8ef6cf08f62de160089fa55f8caeb1c5a30880c..43e97dbc63bbd1aff654d5fa0c9075744cefa637 100644 (file)
--- a/session.c
+++ b/session.c
@@ -25,9 +25,6 @@
 #include "libsigrok.h"
 #include "libsigrok-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);
 }