fix bugs in interrupt handling of TCP system calls

svn: r10706
This commit is contained in:
Matthew Flatt 2008-07-10 13:50:24 +00:00
parent 14cd61f353
commit 5c183baf6e

View File

@ -1327,8 +1327,12 @@ static void tcp_close_input(Scheme_Input_Port *port)
data = (Scheme_Tcp *)port->port_data; data = (Scheme_Tcp *)port->port_data;
#ifdef USE_SOCKETS_TCP #ifdef USE_SOCKETS_TCP
if (!(data->flags & MZ_TCP_ABANDON_INPUT)) if (!(data->flags & MZ_TCP_ABANDON_INPUT)) {
shutdown(data->tcp, 0); int cr;
do {
cr = shutdown(data->tcp, 0);
} while ((cr == -1) && (errno == EINTR));
}
#endif #endif
if (--data->b.refcount) if (--data->b.refcount)
@ -1519,8 +1523,12 @@ static void tcp_close_output(Scheme_Output_Port *port)
tcp_flush(port, 0, 0); tcp_flush(port, 0, 0);
#ifdef USE_SOCKETS_TCP #ifdef USE_SOCKETS_TCP
if (!(data->flags & MZ_TCP_ABANDON_OUTPUT)) if (!(data->flags & MZ_TCP_ABANDON_OUTPUT)) {
shutdown(data->tcp, 1); int cr;
do {
cr = shutdown(data->tcp, 1);
} while ((cr == -1) && (errno == EINTR));
}
#endif #endif
if (--data->b.refcount) if (--data->b.refcount)
@ -2158,7 +2166,7 @@ tcp_accept(int argc, Scheme_Object *argv[])
int was_closed = 0, errid, ready_pos; int was_closed = 0, errid, ready_pos;
Scheme_Object *listener; Scheme_Object *listener;
# ifdef USE_SOCKETS_TCP # ifdef USE_SOCKETS_TCP
tcp_t s; tcp_t s, ls;
unsigned int l; unsigned int l;
GC_CAN_IGNORE char tcp_accept_addr[MZ_SOCK_NAME_MAX_LEN]; GC_CAN_IGNORE char tcp_accept_addr[MZ_SOCK_NAME_MAX_LEN];
# endif # endif
@ -2191,12 +2199,12 @@ tcp_accept(int argc, Scheme_Object *argv[])
scheme_custodian_check_available(NULL, "tcp-accept", "network"); scheme_custodian_check_available(NULL, "tcp-accept", "network");
# ifdef USE_SOCKETS_TCP # ifdef USE_SOCKETS_TCP
s = ((listener_t *)listener)->s[ready_pos-1]; ls = ((listener_t *)listener)->s[ready_pos-1];
l = sizeof(tcp_accept_addr); l = sizeof(tcp_accept_addr);
do { do {
s = accept(s, (struct sockaddr *)tcp_accept_addr, &l); s = accept(ls, (struct sockaddr *)tcp_accept_addr, &l);
} while ((s == -1) && (NOT_WINSOCK(errno) == EINTR)); } while ((s == -1) && (NOT_WINSOCK(errno) == EINTR));
if (s != INVALID_SOCKET) { if (s != INVALID_SOCKET) {