rubinius 2.0.0.rc1 (1.8.7 96db2d8e yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]
Linux donald 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2+deb7u2 x86_64 GNU/Linux
The error occurs with the method "sendmesg" (blocking) of class BasicSocket on Ruby rubinius, but does not occur on RMI Ruby 1.9.3-p392 (rvm). RMI Ruby 2.0.0-p0 (rvm) works partially. See bug report http://bugs.ruby-lang.org/issues/8442.
The error does not occur with the method "send" (non-blocking) of class BasicSocket on above Rubinius version (rvm), Ruby 1.9.3-p392 (rvm) and Ruby 2.0.0-p0 (rvm).
The bug can be reproduced with the code found in the following gist.
How to reproduce the error:
on second terminal (unix):
telnet localhost 10001
on Windows use telnet client e.g. putty and make sure to configure putty as passive ("Connection->Telnet->Telnet negotiation mode: Passive")
What the code does:
It implements the halfsync_halfasync design-pattern (see references in the code).
An EchoAcceptor is registered with the reactor to accept connection setup.
The first thread from the thread pool waiting grabs the received data and the socket from the shared queue and in line 50/51 adds the thread-ID, the number of messages handled by that thread and sends it as a reply to the sender using the received socket.
What to expect as output:
Upon entering e.g. text "!1234" and pressing return
On Ruby 1.9.3-p392 on Linux:
See the as response the thread ID, the number of messages within the thread and the text.
On rubinius 2.0.0.rc1 (1.8.7 96db2d8 yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]:
No response to telnet is sent, but the sending thread crashes.
Everything works fine, if instead of blocking send (line 50/51) the non-blocking send (line 52/53) is used. However correct implementation of the halfsync-halfasync pattern, requires reasonably the usage of blocking "sendmesg" in thread pool.
I have to apologize that the program to reproduce the error is slightly large and complicated, but I believe that there is value, when ruby is able to run well known design patterns correctly.
A similar bug is filed for Ruby MRI here:
A similar bug is filed for JRuby here:
Looks like this problem in Rubinius is basically that BasicSocket#sendmsg is missing and hasn't been implemented yet:
Moving over to rubysl/rubysl-socket#4