diff options
author | grothoff <grothoff@140774ce-b5e7-0310-ab8b-a85725594a96> | 2009-07-17 12:22:15 +0000 |
---|---|---|
committer | grothoff <grothoff@140774ce-b5e7-0310-ab8b-a85725594a96> | 2009-07-17 12:22:15 +0000 |
commit | 2cd99b067ee9359b80a7af0ea1f99f5a2d1c7bd3 (patch) | |
tree | 2427c371e95a0c89d62491cebf761197de78e111 | |
parent | 013a71527cbfe9a6363a4eaa1fb442d910036bfd (diff) |
bugfix
git-svn-id: https://gnunet.org/svn/gnunet@8727 140774ce-b5e7-0310-ab8b-a85725594a96
-rw-r--r-- | src/util/network.c | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/src/util/network.c b/src/util/network.c index aae9d68723..674000d8e3 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -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 @@ transmit_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 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 @@ SCHEDULE_WRITE: 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 @@ GNUNET_NETWORK_notify_transmit_ready (struct GNUNET_NETWORK_SocketHandle &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; } |