Fix poll able streams for Darwin (and probably BSD)
authorJohn Ralls <jralls@ceridwen.us>
Fri, 9 Nov 2012 17:22:19 +0000 (09:22 -0800)
committerJohn Ralls <jralls@ceridwen.us>
Fri, 9 Nov 2012 17:23:01 +0000 (09:23 -0800)
Darwin's poll doesn't change revents if there are no available events, though it returns 0. Initialize the fd.revents to 0 so that the test passes.

That reveals a test failure, though, because with socket streams it takes time for an event to pass through the socket. Provide an 80-usec delay to allow time for the propagation.

gio/gsocket.c
gio/gunixinputstream.c
gio/gunixoutputstream.c
gio/tests/converter-stream.c
gio/tests/pollable.c

index fffd304..13dff46 100644 (file)
@@ -3388,6 +3388,7 @@ g_socket_condition_check (GSocket      *socket,
     gint result;
     poll_fd.fd = socket->priv->fd;
     poll_fd.events = condition;
+    poll_fd.revents = 0;
 
     do
       result = g_poll (&poll_fd, 1, 0);
index a1639f6..b2c4e3f 100644 (file)
@@ -577,6 +577,7 @@ g_unix_input_stream_pollable_is_readable (GPollableInputStream *stream)
 
   poll_fd.fd = unix_stream->priv->fd;
   poll_fd.events = G_IO_IN;
+  poll_fd.revents = 0;
 
   do
     result = g_poll (&poll_fd, 1, 0);
index 4e00dcb..61ba683 100644 (file)
@@ -532,6 +532,7 @@ g_unix_output_stream_pollable_is_writable (GPollableOutputStream *stream)
 
   poll_fd.fd = unix_stream->priv->fd;
   poll_fd.events = G_IO_OUT;
+  poll_fd.revents = 0;
 
   do
     result = g_poll (&poll_fd, 1, 0);
index c3d2106..7c58f03 100644 (file)
@@ -1016,6 +1016,12 @@ test_converter_pollable (void)
          socket_out = NULL;
        }
 
+      /* Wait a few ticks to check for the pipe to propagate the
+       * write. Finesses the race condition in the following test,
+       * where is_readable fails because the write hasn't propagated,
+       * but the read then succeeds because it has. */
+      g_usleep (80L);
+
       is_readable = g_pollable_input_stream_is_readable (pollable_in);
       res = g_pollable_input_stream_read_nonblocking (pollable_in,
                                                      inptr, 1,
index 0633e4a..9cd79b0 100644 (file)
@@ -70,6 +70,9 @@ write_callback (gpointer user_data)
   nwrote = g_output_stream_write (out, buf, 2, NULL, &error);
   g_assert_no_error (error);
   g_assert_cmpint (nwrote, ==, 2);
+/* Give the pipe a few ticks to propagate the write for sockets. On my
+ * iMac i7, 40 works, 30 doesn't. */
+  g_usleep (80L);
 
   check_source_readability_callback (GINT_TO_POINTER (TRUE));