From: normalperson@... Date: 2014-02-18T10:43:21+00:00 Subject: [ruby-core:60823] [ruby-trunk - Bug #9356] TCPSocket.new does not seem to handle INTR Issue #9356 has been updated by Eric Wong. "U.Nakamura" 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, 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. ---------------------------------------- Bug #9356: TCPSocket.new does not seem to handle INTR https://bugs.ruby-lang.org/issues/9356#change-45238 * Author: Charlie Somerville * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: - * Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- TCPSocket.new does not seem to handle EINTR properly. In the attached test script, I try to open a TCP connection to my server and make an HTTP request while a background thread continually sends a signal to the process. This causes the #write call to fail with: x.rb:13:in `write': Socket is not connected (Errno::ENOTCONN) from x.rb:13:in `
' This also appears to affect 2.0.0. 1.9.3 is unaffected. ---Files-------------------------------- socket-eintr.rb (207 Bytes) -- http://bugs.ruby-lang.org/