diff options
author | Christian Grothoff <christian@grothoff.org> | 2009-07-17 12:22:15 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2009-07-17 12:22:15 +0000 |
commit | 6c95abc6f34bd727fe8737d44f463faac6ec96f0 (patch) | |
tree | 2427c371e95a0c89d62491cebf761197de78e111 /src | |
parent | c5594877b3562ed4eb57f42c0f7282ec483fd619 (diff) | |
download | gnunet-6c95abc6f34bd727fe8737d44f463faac6ec96f0.tar.gz gnunet-6c95abc6f34bd727fe8737d44f463faac6ec96f0.zip |
bugfix
Diffstat (limited to 'src')
-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 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 | ||