From 5c183baf6e3c2dae2fac6d42c01b570ea15135d6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 10 Jul 2008 13:50:24 +0000 Subject: [PATCH] fix bugs in interrupt handling of TCP system calls svn: r10706 --- src/mzscheme/src/network.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/mzscheme/src/network.c b/src/mzscheme/src/network.c index 2c0e163e35..6f8b895547 100644 --- a/src/mzscheme/src/network.c +++ b/src/mzscheme/src/network.c @@ -1327,8 +1327,12 @@ static void tcp_close_input(Scheme_Input_Port *port) data = (Scheme_Tcp *)port->port_data; #ifdef USE_SOCKETS_TCP - if (!(data->flags & MZ_TCP_ABANDON_INPUT)) - shutdown(data->tcp, 0); + if (!(data->flags & MZ_TCP_ABANDON_INPUT)) { + int cr; + do { + cr = shutdown(data->tcp, 0); + } while ((cr == -1) && (errno == EINTR)); + } #endif if (--data->b.refcount) @@ -1519,8 +1523,12 @@ static void tcp_close_output(Scheme_Output_Port *port) tcp_flush(port, 0, 0); #ifdef USE_SOCKETS_TCP - if (!(data->flags & MZ_TCP_ABANDON_OUTPUT)) - shutdown(data->tcp, 1); + if (!(data->flags & MZ_TCP_ABANDON_OUTPUT)) { + int cr; + do { + cr = shutdown(data->tcp, 1); + } while ((cr == -1) && (errno == EINTR)); + } #endif if (--data->b.refcount) @@ -2158,7 +2166,7 @@ tcp_accept(int argc, Scheme_Object *argv[]) int was_closed = 0, errid, ready_pos; Scheme_Object *listener; # ifdef USE_SOCKETS_TCP - tcp_t s; + tcp_t s, ls; unsigned int l; GC_CAN_IGNORE char tcp_accept_addr[MZ_SOCK_NAME_MAX_LEN]; # endif @@ -2191,12 +2199,12 @@ tcp_accept(int argc, Scheme_Object *argv[]) scheme_custodian_check_available(NULL, "tcp-accept", "network"); # 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); 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)); if (s != INVALID_SOCKET) {