gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r8727 - gnunet/src/util


From: gnunet
Subject: [GNUnet-SVN] r8727 - gnunet/src/util
Date: Fri, 17 Jul 2009 06:22:15 -0600

Author: grothoff
Date: 2009-07-17 06:22:15 -0600 (Fri, 17 Jul 2009)
New Revision: 8727

Modified:
   gnunet/src/util/network.c
Log:
bugfix

Modified: gnunet/src/util/network.c
===================================================================
--- gnunet/src/util/network.c   2009-07-17 12:16:10 UTC (rev 8726)
+++ gnunet/src/util/network.c   2009-07-17 12:22:15 UTC (rev 8727)
@@ -40,7 +40,7 @@
 #include "gnunet_network_lib.h"
 #include "gnunet_scheduler_lib.h"
 
-#define DEBUG_NETWORK GNUNET_NO
+#define DEBUG_NETWORK GNUNET_YES
 
 /**
  * List of address families to give as hints to
@@ -1120,18 +1120,29 @@
                                       sock);
       return;
     }
-  if (sock->sock == -1)
+  if ( (sock->sock == -1) ||
+       ( (0 != (tc->reason & GNUNET_SCHEDULER_REASON_TIMEOUT)) &&
+        (0 == (tc->reason & GNUNET_SCHEDULER_REASON_PREREQ_DONE)) &&
+        (!FD_ISSET (sock->sock, tc->write_ready)))  )
     {
 #if DEBUG_NETWORK
       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                   _("Could not satisfy pending transmission request, socket 
closed or connect failed.\n"));
 #endif
+      if (-1 != sock->sock)
+       {
+         SHUTDOWN (sock->sock, SHUT_RDWR);
+         GNUNET_break (0 == CLOSE (sock->sock));
+         sock->sock = -1;
+       }
       transmit_error (sock);
       return;                   /* connect failed for good, we're finished */
     }
-  if ((tc->write_ready == NULL) || (!FD_ISSET (sock->sock, tc->write_ready)))
+ if ((tc->write_ready == NULL) || (!FD_ISSET (sock->sock, tc->write_ready)))
     {
-      /* special circumstances: not yet ready to write */
+      /* special circumstances (in particular,
+        PREREQ_DONE after connect): not yet ready to write,
+        but no "fatal" error either.  Hence retry.  */
       goto SCHEDULE_WRITE;
     }
   GNUNET_assert (sock->write_buffer_off >= sock->write_buffer_pos);
@@ -1190,7 +1201,7 @@
                                   GNUNET_NO,
                                   GNUNET_SCHEDULER_PRIORITY_KEEP,
                                   GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
-                                  GNUNET_TIME_UNIT_FOREVER_REL,
+                                  GNUNET_TIME_absolute_get_remaining 
(sock->nth.transmit_timeout),
                                   sock->sock, &transmit_ready, sock);
 }
 
@@ -1247,12 +1258,23 @@
                                                          &transmit_timeout,
                                                          sock);
   if (sock->write_task == GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
-    sock->write_task = GNUNET_SCHEDULER_add_delayed (sock->sched,
-                                                     GNUNET_NO,
-                                                     
GNUNET_SCHEDULER_PRIORITY_KEEP,
-                                                     sock->connect_task,
-                                                     GNUNET_TIME_UNIT_ZERO,
-                                                     &transmit_ready, sock);
+    {
+      if (sock->connect_task == GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
+       sock->write_task = GNUNET_SCHEDULER_add_write (sock->sched,
+                                                      GNUNET_NO,
+                                                      
GNUNET_SCHEDULER_PRIORITY_KEEP,
+                                                      
GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
+                                                      
GNUNET_TIME_absolute_get_remaining (sock->nth.transmit_timeout),
+                                                      sock->sock,
+                                                      &transmit_ready, sock);
+      else
+       sock->write_task = GNUNET_SCHEDULER_add_delayed (sock->sched,
+                                                        GNUNET_NO,
+                                                        
GNUNET_SCHEDULER_PRIORITY_KEEP,
+                                                        sock->connect_task,
+                                                        GNUNET_TIME_UNIT_ZERO,
+                                                        &transmit_ready, sock);
+    }
   return &sock->nth;
 }
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]