From: Kero van Gelder Date: 2003-08-02T18:37:40+09:00 Subject: 1.8.0-previewX rb_sys_fail() on socket instead of an Exception. Hi all, Find some code below to reliably cause a rb_sys_fail() for server.rb, whenever it is run by ruby 1.8.0-previewX on a Linux system (2.2 kernel RH 6.something, 2.4.21-smp kernel RH 7.3, 2.5 kernel debian unstable). The client can be ran with 1.6.8, still causes rb_sys_fail(). I get normal exceptions/nil-from-gets for Ruby 1.6.8, or when running on HP-UX. If I run the server with 1.6.8 and the client with 1.8.0-pX, all is fine, too. The code below is simplified from my real codebase at work, where the rb_sys_fail() means the server crashes, without possibility of recovery. However, I can not take any more code out of these snippets, or the behaviour goes to normal/desired: exception or nil-from-gets. Please find the code below, or here: http://httpd.chello.nl/k.vangelder/ruby/broken_socket.zip Bye, Kero. server.rb --------- require 'socket' server = TCPServer.new('localhost', 1357) while socket = server.accept() t = Thread.new { loop { begin line = socket.gets puts line rescue end } } i = 0 loop { socket.puts("hello") sleep 1 i += 1 } end client.rb --------- require 'socket' require 'duty' socket = TCPSocket.new('localhost', 1357) while line = socket.gets() puts line Heavy::duty() # client can be killed (^C at command line) ... socket.puts("world #{nonexistant}") # ... or will die here, # either causes crash at server.rb end duty.c ------ #include VALUE rb_duty(VALUE module) { int i, j, k; for (i=0; i<1000; i++) { for (j=0; j<1500; j++) { /* lower numbers on slower systems... */ for (k=0; k<2000; k++) { int nr = i*j+k; } } } return Qnil; } void Init_duty() { VALUE rb_mHeavy = rb_define_module("Heavy"); rb_define_module_function(rb_mHeavy, "duty", rb_duty, 0); } extconf.rb ---------- require 'mkmf' create_makefile("duty")