[glib] GSocket: fix GIOCondition on timed-out socket operation



commit cef679d004b9fe89ae08519861e235818dd57b46
Author: Dan Winship <danw gnome org>
Date:   Sat Aug 27 09:59:02 2011 -0400

    GSocket: fix GIOCondition on timed-out socket operation
    
    The docs for g_socket_set_timeout() claimed that if an async operation
    timed out, the GIOCondition passed to the source callback would be
    G_IO_IN or G_IO_OUT (thus prompting the caller to call
    g_socket_receive/send and get a G_IO_ERROR_TIMED_OUT), but in fact it
    ended up being 0, and gio/tests/socket.c was erroneously testing for
    that instead of the correct value. Fix this.

 gio/gsocket.c      |    3 ++-
 gio/tests/socket.c |    4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)
---
diff --git a/gio/gsocket.c b/gio/gsocket.c
index f1ba5dd..77d2d2c 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -2439,7 +2439,6 @@ socket_source_prepare (GSource *source,
       if (*timeout < 0)
         {
           socket_source->socket->priv->timed_out = TRUE;
-          socket_source->pollfd.revents = socket_source->condition & (G_IO_IN | G_IO_OUT);
           *timeout = 0;
           return TRUE;
         }
@@ -2476,6 +2475,8 @@ socket_source_dispatch (GSource     *source,
 #ifdef G_OS_WIN32
   socket_source->pollfd.revents = update_condition (socket_source->socket);
 #endif
+  if (socket_source->socket->priv->timed_out)
+    socket_source->pollfd.revents |= socket_source->condition & (G_IO_IN | G_IO_OUT);
 
   return (*func) (socket_source->socket,
 		  socket_source->pollfd.revents & socket_source->condition,
diff --git a/gio/tests/socket.c b/gio/tests/socket.c
index 87b426e..2b8ea62 100644
--- a/gio/tests/socket.c
+++ b/gio/tests/socket.c
@@ -178,7 +178,7 @@ test_ip_async_timed_out (GSocket      *client,
 
   if (data->family == G_SOCKET_FAMILY_IPV4)
     {
-      g_assert_cmpint (cond, ==, 0);
+      g_assert_cmpint (cond, ==, G_IO_IN);
       len = g_socket_receive (client, buf, sizeof (buf), NULL, &error);
       g_assert_cmpint (len, ==, -1);
       g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT);
@@ -554,7 +554,7 @@ main (int   argc,
   g_test_add_func ("/socket/ipv4_sync", test_ipv4_sync);
   g_test_add_func ("/socket/ipv4_async", test_ipv4_async);
   g_test_add_func ("/socket/ipv6_sync", test_ipv6_sync);
-  g_test_add_func ("/socket/ipv6_sync", test_ipv6_async);
+  g_test_add_func ("/socket/ipv6_async", test_ipv6_async);
 #ifdef G_OS_UNIX
   g_test_add_func ("/socket/unix-from-fd", test_unix_from_fd);
   g_test_add_func ("/socket/unix-connection", test_unix_connection);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]