aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2009-07-17 12:22:15 +0000
committerChristian Grothoff <christian@grothoff.org>2009-07-17 12:22:15 +0000
commit6c95abc6f34bd727fe8737d44f463faac6ec96f0 (patch)
tree2427c371e95a0c89d62491cebf761197de78e111 /src
parentc5594877b3562ed4eb57f42c0f7282ec483fd619 (diff)
downloadgnunet-6c95abc6f34bd727fe8737d44f463faac6ec96f0.tar.gz
gnunet-6c95abc6f34bd727fe8737d44f463faac6ec96f0.zip
bugfix
Diffstat (limited to 'src')
-rw-r--r--src/util/network.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/src/util/network.c b/src/util/network.c
index aae9d6872..674000d8e 100644
--- a/src/util/network.c
+++ b/src/util/network.c
@@ -40,7 +40,7 @@
40#include "gnunet_network_lib.h" 40#include "gnunet_network_lib.h"
41#include "gnunet_scheduler_lib.h" 41#include "gnunet_scheduler_lib.h"
42 42
43#define DEBUG_NETWORK GNUNET_NO 43#define DEBUG_NETWORK GNUNET_YES
44 44
45/** 45/**
46 * List of address families to give as hints to 46 * List of address families to give as hints to
@@ -1120,18 +1120,29 @@ transmit_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1120 sock); 1120 sock);
1121 return; 1121 return;
1122 } 1122 }
1123 if (sock->sock == -1) 1123 if ( (sock->sock == -1) ||
1124 ( (0 != (tc->reason & GNUNET_SCHEDULER_REASON_TIMEOUT)) &&
1125 (0 == (tc->reason & GNUNET_SCHEDULER_REASON_PREREQ_DONE)) &&
1126 (!FD_ISSET (sock->sock, tc->write_ready))) )
1124 { 1127 {
1125#if DEBUG_NETWORK 1128#if DEBUG_NETWORK
1126 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1129 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1127 _("Could not satisfy pending transmission request, socket closed or connect failed.\n")); 1130 _("Could not satisfy pending transmission request, socket closed or connect failed.\n"));
1128#endif 1131#endif
1132 if (-1 != sock->sock)
1133 {
1134 SHUTDOWN (sock->sock, SHUT_RDWR);
1135 GNUNET_break (0 == CLOSE (sock->sock));
1136 sock->sock = -1;
1137 }
1129 transmit_error (sock); 1138 transmit_error (sock);
1130 return; /* connect failed for good, we're finished */ 1139 return; /* connect failed for good, we're finished */
1131 } 1140 }
1132 if ((tc->write_ready == NULL) || (!FD_ISSET (sock->sock, tc->write_ready))) 1141 if ((tc->write_ready == NULL) || (!FD_ISSET (sock->sock, tc->write_ready)))
1133 { 1142 {
1134 /* special circumstances: not yet ready to write */ 1143 /* special circumstances (in particular,
1144 PREREQ_DONE after connect): not yet ready to write,
1145 but no "fatal" error either. Hence retry. */
1135 goto SCHEDULE_WRITE; 1146 goto SCHEDULE_WRITE;
1136 } 1147 }
1137 GNUNET_assert (sock->write_buffer_off >= sock->write_buffer_pos); 1148 GNUNET_assert (sock->write_buffer_off >= sock->write_buffer_pos);
@@ -1190,7 +1201,7 @@ SCHEDULE_WRITE:
1190 GNUNET_NO, 1201 GNUNET_NO,
1191 GNUNET_SCHEDULER_PRIORITY_KEEP, 1202 GNUNET_SCHEDULER_PRIORITY_KEEP,
1192 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK, 1203 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
1193 GNUNET_TIME_UNIT_FOREVER_REL, 1204 GNUNET_TIME_absolute_get_remaining (sock->nth.transmit_timeout),
1194 sock->sock, &transmit_ready, sock); 1205 sock->sock, &transmit_ready, sock);
1195} 1206}
1196 1207
@@ -1247,12 +1258,23 @@ GNUNET_NETWORK_notify_transmit_ready (struct GNUNET_NETWORK_SocketHandle
1247 &transmit_timeout, 1258 &transmit_timeout,
1248 sock); 1259 sock);
1249 if (sock->write_task == GNUNET_SCHEDULER_NO_PREREQUISITE_TASK) 1260 if (sock->write_task == GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
1250 sock->write_task = GNUNET_SCHEDULER_add_delayed (sock->sched, 1261 {
1251 GNUNET_NO, 1262 if (sock->connect_task == GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
1252 GNUNET_SCHEDULER_PRIORITY_KEEP, 1263 sock->write_task = GNUNET_SCHEDULER_add_write (sock->sched,
1253 sock->connect_task, 1264 GNUNET_NO,
1254 GNUNET_TIME_UNIT_ZERO, 1265 GNUNET_SCHEDULER_PRIORITY_KEEP,
1255 &transmit_ready, sock); 1266 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
1267 GNUNET_TIME_absolute_get_remaining (sock->nth.transmit_timeout),
1268 sock->sock,
1269 &transmit_ready, sock);
1270 else
1271 sock->write_task = GNUNET_SCHEDULER_add_delayed (sock->sched,
1272 GNUNET_NO,
1273 GNUNET_SCHEDULER_PRIORITY_KEEP,
1274 sock->connect_task,
1275 GNUNET_TIME_UNIT_ZERO,
1276 &transmit_ready, sock);
1277 }
1256 return &sock->nth; 1278 return &sock->nth;
1257} 1279}
1258 1280