From: Eric Wong Date: 2014-01-03T17:53:38+00:00 Subject: [ruby-core:59536] Re: [ruby-trunk - Bug #9356][Open] TCPSocket.new does not seem to handle INTR This might be a bug exposed due to r36944 ("avoid unnecessary select() calls before doing I/O") which I don't want to revert. Does the following fix it? --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -400,12 +400,6 @@ rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks) status = (int)BLOCKING_REGION_FD(func, &arg); if (status < 0) { switch (errno) { - case EINTR: -#if defined(ERESTART) - case ERESTART: -#endif - continue; - case EAGAIN: #ifdef EINPROGRESS case EINPROGRESS: @@ -426,6 +420,12 @@ rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks) #if WAIT_IN_PROGRESS > 0 wait_in_progress = WAIT_IN_PROGRESS; #endif + case EINTR: +#if defined(ERESTART) + case ERESTART: +#endif + continue; + status = wait_connectable(fd); if (status) { break; ----------------------------------------------------------------------- Fwiw, I'm not sure if the WAIT_IN_PROGRESS + getsockopt SO_ERROR is even necessary when we can just do wait_connectable(fd) followed by an eventual write/send/read/recv...