gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r19992 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r19992 - gnunet/src/transport
Date: Thu, 23 Feb 2012 19:08:02 +0100

Author: wachs
Date: 2012-02-23 19:08:02 +0100 (Thu, 23 Feb 2012)
New Revision: 19992

Modified:
   gnunet/src/transport/plugin_transport_unix.c
Log:
improved rescheduling
improved recv error handling


Modified: gnunet/src/transport/plugin_transport_unix.c
===================================================================
--- gnunet/src/transport/plugin_transport_unix.c        2012-02-23 17:49:55 UTC 
(rev 19991)
+++ gnunet/src/transport/plugin_transport_unix.c        2012-02-23 18:08:02 UTC 
(rev 19992)
@@ -223,6 +223,8 @@
    */
   struct GNUNET_NETWORK_FDSet *ws;
 
+  int with_ws;
+
   /**
    * socket that we transmit all data with
    */
@@ -315,7 +317,7 @@
   GNUNET_break (GNUNET_OK ==
                 GNUNET_NETWORK_socket_close (plugin->unix_sock.desc));
   plugin->unix_sock.desc = NULL;
-
+  plugin->with_ws = GNUNET_NO;
   return GNUNET_OK;
 }
 
@@ -635,17 +637,20 @@
               (char *) session->addr);
 #endif
 
-  if (plugin->select_task != GNUNET_SCHEDULER_NO_TASK)
-    GNUNET_SCHEDULER_cancel(plugin->select_task);
+  if (plugin->with_ws == GNUNET_NO)
+  {
+    if (plugin->select_task != GNUNET_SCHEDULER_NO_TASK)
+      GNUNET_SCHEDULER_cancel(plugin->select_task);
 
-  plugin->select_task =
-      GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
-                                   GNUNET_SCHEDULER_NO_TASK,
-                                   GNUNET_TIME_UNIT_FOREVER_REL,
-                                   plugin->rs,
-                                   plugin->ws,
-                                   &unix_plugin_select, plugin);
-
+    plugin->select_task =
+        GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
+                                     GNUNET_SCHEDULER_NO_TASK,
+                                     GNUNET_TIME_UNIT_FOREVER_REL,
+                                     plugin->rs,
+                                     plugin->ws,
+                                     &unix_plugin_select, plugin);
+    plugin->with_ws = GNUNET_YES;
+  }
   return ssize;
 }
 
@@ -705,6 +710,9 @@
       GNUNET_NETWORK_socket_recvfrom (plugin->unix_sock.desc, buf, sizeof 
(buf),
                                       (struct sockaddr *) &un, &addrlen);
 
+  if ((GNUNET_SYSERR == ret) && ((errno == EAGAIN) || (errno == ENOBUFS)))
+    return;
+
   if (ret == GNUNET_SYSERR)
   {
     GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "recvfrom");
@@ -807,7 +815,7 @@
   if ((tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
     return;
 
-
+  plugin->with_ws = GNUNET_NO;
   if ((tc->reason & GNUNET_SCHEDULER_REASON_WRITE_READY) != 0)
   {
     GNUNET_assert (GNUNET_NETWORK_fdset_isset
@@ -823,6 +831,8 @@
     unix_plugin_select_read (plugin);
   }
 
+  if (plugin->select_task != GNUNET_SCHEDULER_NO_TASK)
+    GNUNET_SCHEDULER_cancel (plugin->select_task);
   plugin->select_task =
       GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
                                    GNUNET_SCHEDULER_NO_TASK,
@@ -830,6 +840,8 @@
                                    plugin->rs,
                                    (plugin->msg_head != NULL) ? plugin->ws : 
NULL,
                                    &unix_plugin_select, plugin);
+  if (plugin->msg_head != NULL)
+    plugin->with_ws = GNUNET_YES;
 }
 
 /**
@@ -895,8 +907,12 @@
   plugin->select_task =
       GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
                                    GNUNET_SCHEDULER_NO_TASK,
-                                   GNUNET_TIME_UNIT_FOREVER_REL, plugin->rs,
-                                   plugin->ws, &unix_plugin_select, plugin);
+                                   GNUNET_TIME_UNIT_FOREVER_REL,
+                                   plugin->rs,
+                                   NULL,
+                                   &unix_plugin_select, plugin);
+  plugin->with_ws = GNUNET_NO;
+
   return 1;
 }
 




reply via email to

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