From: Eric Wong Date: 2014-02-20T22:03:57+00:00 Subject: [ruby-core:60912] Re: [ruby-trunk - Bug #9356] TCPSocket.new does not seem to handle INTR shugo@ruby-lang.org wrote: > I'd like to hear others' thoughts. Likewise. We need to hear folks with more experience on other OSes. > Linux's connect() does return ERESTART when it's interrupted by a signal. > On Linux, connect() is restartable. Please see the following page: > > http://www.madore.org/~david/computers/connect-intr.html > > The above page describes connect() returns EINTR on Linux, but it seems to return ERESTART nowadays. > (And it describes connect() returns EADDRINUSE instead of EALREADY on FreeBSD, but it returns EALREADY now.) Interesting. Anyways I'm not against handling ERESTART. Note, POSIX connect manpage says this: If connect() is interrupted by a signal that is caught while blocked waiting to establish a connection, connect() shall fail and set errno to [EINTR], but the connection request shall not be aborted, and the connection shall be established asynchronously. ref: http://pubs.opengroup.org/onlinepubs/009695399/functions/connect.html Of course, not every system is POSIX-compliant. Anyways, I have an alternative (v3) patch here which retries connect() on EINTR and ERESTART: http://bogomips.org/ruby.git/patch?id=8f48b1862 (also note my new switch/case style to avoid inline ifdef :) However, I still prefer my v2 if possible: http://bogomips.org/ruby.git/patch?id=f5e2eb00e5