Issue #9356 has been updated by Eric Wong.


 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

----------------------------------------
Bug #9356: TCPSocket.new does not seem to handle INTR
https://bugs.ruby-lang.org/issues/9356#change-45312

* 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 `<main>'

This also appears to affect 2.0.0. 1.9.3 is unaffected.

---Files--------------------------------
socket-eintr.rb (207 Bytes)


-- 
http://bugs.ruby-lang.org/