From f8bb1ee6e0059fa94aaae188f5fc3461e6961ed2 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Thu, 23 Feb 2012 18:08:02 +0000 Subject: improved rescheduling improved recv error handling --- src/transport/plugin_transport_unix.c | 46 +++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'src/transport/plugin_transport_unix.c') diff --git a/src/transport/plugin_transport_unix.c b/src/transport/plugin_transport_unix.c index 317ff2089..499cc23ad 100644 --- a/src/transport/plugin_transport_unix.c +++ b/src/transport/plugin_transport_unix.c @@ -223,6 +223,8 @@ struct Plugin */ struct GNUNET_NETWORK_FDSet *ws; + int with_ws; + /** * socket that we transmit all data with */ @@ -315,7 +317,7 @@ unix_transport_server_stop (void *cls) 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 @@ unix_plugin_send (void *cls, (char *) session->addr); #endif - 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); - + 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->with_ws = GNUNET_YES; + } return ssize; } @@ -705,6 +710,9 @@ unix_plugin_select_read (struct Plugin * plugin) 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 @@ unix_plugin_select (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 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 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 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 @@ unix_plugin_select (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 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 @@ unix_transport_server_start (void *cls) 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; } -- cgit v1.2.3