From: acid06@... Date: 2014-01-24T17:47:52+00:00 Subject: [ruby-core:60061] [ruby-trunk - Bug #9447] [Open] Bad interaction between Fibers and Trap handlers in Ruby > 2.0.0 Issue #9447 has been reported by Nilson Santos Figueiredo Junior. ---------------------------------------- Bug #9447: Bad interaction between Fibers and Trap handlers in Ruby > 2.0.0 https://bugs.ruby-lang.org/issues/9447 * Author: Nilson Santos Figueiredo Junior * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: ruby 2.0.0p247 * Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- Hi there, I've been using and Alarm class I created, which gives Ruby code access to the alarm system call. It used to work perfectly on 1.9.3 with no issues and more than 1 year of production usage. Ruby 2.0.0 doesn't let me use it properly, apparently when there's an alarm timeout, the interpreter will think the code is in the trap context forever, so when I try to use Logger afterwards, it will fail (since it uses a Mutex internally). Below is my Alarm implementation. require 'dl' require 'dl/import' module Alarm module SystemCall extend DL::Importer # imports the POSIX alarm function begin dlload 'libc.so.6' rescue begin dlload 'libc.so.5' rescue dlload 'libc.dylib' end end extern 'unsigned int alarm(unsigned int)' end def self.alarm(n) # creates new fiber which will the code block passed as argument fiber = Fiber.new { yield } begin # new signal handler for the alarm call handler = Signal.trap('ALRM') do # yields fiber, which makes the control flow continue after # after the last resume call for this fiber # (in other words, returns from this function) Fiber.yield end # start timing SystemCall.alarm(n) # start running timed call result = fiber.resume ensure # cancel alarms and restore the previous signal handler SystemCall.alarm(0) Signal.trap('ALRM', handler) end return result end end Is this sort of thing really no longer supported in Ruby > 2.0.0 or is it a bug? As I've said, it worked perfectly on 1.9.3. This class is used like this: Alarm.alarm(timeout_seconds) do # potentially time consuming operation which must have a timeout end Due to other requirements, I can't use the Timeout module, as it creates another thread. Thanks in advance. -- http://bugs.ruby-lang.org/