[#30995] [Bug #3523] win32 exception c0000029 on exit using fibers — B Kelly <redmine@...>

Bug #3523: win32 exception c0000029 on exit using fibers

19 messages 2010/07/02

[#31100] [rubysoc] Queue C-extension patch to come — Ricardo Panaggio <panaggio.ricardo@...>

Hello,

26 messages 2010/07/07
[#31148] Re: [rubysoc] Queue C-extension patch to come — Roger Pack <rogerdpack2@...> 2010/07/09

> As this it my first patch to Ruby, I don't know where to begin with.

[#31320] Re: [rubysoc] Queue C-extension patch to come — Ricardo Panaggio <panaggio.ricardo@...> 2010/07/16

Sorry for leaving this thread for so long. I've tried to finish the

[#31322] Re: [rubysoc] Queue C-extension patch to come — Aaron Patterson <aaron@...> 2010/07/16

On Sat, Jul 17, 2010 at 06:55:35AM +0900, Ricardo Panaggio wrote:

[#31324] Re: [rubysoc] Queue C-extension patch to come — Caleb Clausen <vikkous@...> 2010/07/17

NB: I am Ricardo's mentor for this project.

[#31331] Re: [rubysoc] Queue C-extension patch to come — Benoit Daloze <eregontp@...> 2010/07/17

On 17 July 2010 06:00, Caleb Clausen <vikkous@gmail.com> wrote:

[#31332] Re: [rubysoc] Queue C-extension patch to come — Caleb Clausen <vikkous@...> 2010/07/17

On 7/17/10, Benoit Daloze <eregontp@gmail.com> wrote:

[#31138] Why is there no standard way of creating a String from a char *? — Nikolai Weibull <now@...>

Hi!

14 messages 2010/07/08
[#31146] Re: Why is there no standard way of creating a String from a char *? — Urabe Shyouhei <shyouhei@...> 2010/07/09

(2010/07/09 7:04), Nikolai Weibull wrote:

[#31149] Re: Why is there no standard way of creating a String from a char *? — Nikolai Weibull <now@...> 2010/07/09

On Fri, Jul 9, 2010 at 06:20, Urabe Shyouhei <shyouhei@ruby-lang.org> wrote:

[#31150] Re: Why is there no standard way of creating a String from a char *? — Urabe Shyouhei <shyouhei@...> 2010/07/09

(2010/07/09 18:28), Nikolai Weibull wrote:

[#31217] [Bug #3562] regression in respond_to? — Aaron Patterson <redmine@...>

Bug #3562: regression in respond_to?

14 messages 2010/07/12

[#31269] [Bug #3566] memory leak when spawning+joining Threads in a loop — Eric Wong <redmine@...>

Bug #3566: memory leak when spawning+joining Threads in a loop

14 messages 2010/07/13

[#31399] [Backport #3595] Theres no encoding to differentiate a stream of Binary data from an 8-Bit ASCII string — Dreamcat Four <redmine@...>

Backport #3595: Theres no encoding to differentiate a stream of Binary data from an 8-Bit ASCII string

17 messages 2010/07/21

[#31459] [Bug #3607] [trunk/r28731] Gem.path has disappeared? — Ollivier Robert <redmine@...>

Bug #3607: [trunk/r28731] Gem.path has disappeared?

22 messages 2010/07/23

[#31519] [Bug #3622] Net::HTTP does not wait to send request body with Expect: 100-continue — Eric Hodel <redmine@...>

Bug #3622: Net::HTTP does not wait to send request body with Expect: 100-continue

9 messages 2010/07/28

[ruby-core:31065] Re: [Bug #3540] IO.copy_stream fails to detect client disconnect w/sendfile

From: Tanaka Akira <akr@...>
Date: 2010-07-06 03:39:30 UTC
List: ruby-core #31065
2010/7/6 Eric Wong <redmine@ruby-lang.org>:
>
> sendfile() may return with a short write upon a client disconnect.  Instead of
> retrying and getting an error, Ruby tries to force a select() on the descriptor
> which fails to detect the disconnect.  This causes IO.copy_stream to hang,
> (possibly until TCP keepalives kick in).  IO.copy_stream should raise
> immediately.

Thank you for the reproducible script and fix.

I'll commit your fix.

However I think the Linux select behavior which doesn't notify writability on
disconnected TCP socket is suspicious.

  linux% ruby -rsocket -e '
  serv = TCPServer.open("127.0.0.1", 8888)
  s1 = TCPSocket.open("127.0.0.1", 8888)
  s2 = serv.accept
  s2.close
  s1.write "a" rescue p $!
  s1.write "a" rescue p $!
  p IO.select(nil, [s1], nil, 0)
  '
  #<Errno::EPIPE: Broken pipe>
  nil

FreeBSD and Solaris notify writability.

  freebsd% ruby -rsocket -e '
  serv = TCPServer.open("127.0.0.1", 8888)
  s1 = TCPSocket.open("127.0.0.1", 8888)
  s2 = serv.accept
  s2.close
  s1.write "a" rescue p $!
  s1.write "a" rescue p $!
  p IO.select(nil, [s1], nil, 0)
  '
  #<Errno::EPIPE: Broken pipe>
  [[], [#<TCPSocket:0x283263d8>], []]

  solaris% ruby -rsocket -e '
  serv = TCPServer.open("127.0.0.1", 8888)
  s1 = TCPSocket.open("127.0.0.1", 8888)
  s2 = serv.accept
  s2.close
  s1.write "a" rescue p $!
  s1.write "a" rescue p $!
  p IO.select(nil, [s1], nil, 0)
  '
  #<Errno::EPIPE: Broken pipe>
  [[], [#<TCPSocket:0x80e6e6c>], []]

I think select should notify writability when write would not block.
Cleary write doesn't block on disconnected socket.

Linux also notify writability for UNIX domain socket pair.

  linux% ruby -rsocket -e '
  s1, s2 = UNIXSocket.pair
  s2.close
  s1.write "a" rescue p $!
  p IO.select(nil, [s1], nil, 0)
  '
  #<Errno::EPIPE: Broken pipe>
  [[], [#<UNIXSocket:fd 3>], []]

I tested Linux 2.6.26.
-- 
Tanaka Akira

In This Thread