TCPServer#accept isn't interrupted
This is another issue I noticed with Eventbox:
This script tries to stop
require "socket" Thread.abort_on_exception = true class Stop < RuntimeError end serv = TCPServer.new("localhost", 12345) th = Thread.handle_interrupt(Exception => :never) do Thread.new do begin Thread.handle_interrupt(Stop => :on_blocking) do # sleep # sleep is aborted serv.accept # but accept isn't end rescue Stop end end end th.raise Stop th.join serv.close
The program freezes and if stopped per CTRL-C the output looks similar to:
$ ruby -d --disable-gems no-interrupt-while-accept.rb ^CException `Interrupt' at no-interrupt-while-accept.rb:23 - Exception `Stop' at no-interrupt-while-accept.rb:15 - Stop Traceback (most recent call last): 1: from no-interrupt-while-accept.rb:23:in `<main>' no-interrupt-while-accept.rb:23:in `join': Interrupt
The debug output shows, that the
Stop exception is delivered after the
Interrupt exception has been delivered to the main thread. However it should be delivered immediately, since it's a blocking operation. In contrast
sleep is aborted as expected.
This issue is present on all older MRI versions. However it doesn't appear on JRuby-18.104.22.168.