"U.Nakamura" <usa / garbagecollect.jp> wrote:
> In message "[ruby-core:60819] [ruby-trunk - Bug #9356] TCPSocket.new does not seem to handle INTR"
>     on Feb.18,2014 18:34:40, <shugo / ruby-lang.org> wrote:
> > Does anybody know why the following code in ext/socket/init.c is necessary?
> > 
> >             if (sockerr == 0)
> >                 continue;       /* workaround for winsock */
> 
> It was introduced at r7931 by me (9 years ago!),
> but I forgot the reason.
> If my comment of those days is believed, we may wrap it
> with #ifdef_WIN32.

OK.  I wonder if we should even use getsockopt(SO_ERROR) at all.

I know there's much literature which recommends it, but any error check
in this way is racy.  Better to let any subsequent
write/read/send/recv/etc error out.

The following should work:

  connect() -> EINPROGRESS
  rb_wait_for_single_fd -> (must retry on EINTR)
  (user calls) write() -> 0, ENOTCONN, EPIPE, ...

Note: rb_wait_for_single_fd is necessary in FreeBSD (at least) to avoid
ENOTCONN, Linux just returns EAGAIN on write if write immediately after
connect.