From: "mame (Yusuke Endoh)" Date: 2021-09-16T14:20:59+00:00 Subject: [ruby-core:105306] [Ruby master Bug#17568] Thread.handle_interrupt is per-Thread but should probably be per-Fiber Issue #17568 has been updated by mame (Yusuke Endoh). ko1 (Koichi Sasada) wrote in #note-2: > mame-san also proposed `Fiber.handle_interrupt` for fiber local handler to set fiber local setting. No I didn't propose it actually. In today's dev meeting, we discussed that there are a case where per-Thread mask is needed (e.g., to take an element from an external enumerator), and a case where per-Fiber mask may be needed (I'm unsure about a concrete case though). I just said that, if so, it is theoretically possible to have both `Thread.handle_interrupt` for per-Thread mask and `Fiber.handle_interrupt` for per-Fiber mask (maybe per-Fiber mask takes precedence if any). But I have no idea whether per-Fiber mask is practically needed. ---------------------------------------- Bug #17568: Thread.handle_interrupt is per-Thread but should probably be per-Fiber https://bugs.ruby-lang.org/issues/17568#change-93716 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal * ruby -v: ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- `Thread.handle_interrupt` and the pending interrupts is currently kept as state on the thread (`rb_thread_t`). However, that seems potentially confusing when `Fiber`s are used. For instance, this innocent-looking `Fiber` will forever disable interrupts in the main thread: ```ruby main_thread = Thread.current never_die = Fiber.new do Thread.handle_interrupt(RuntimeError => :never) do Fiber.yield end end begin Thread.new { main_thread.raise "interrupt1" }.join rescue => e puts "raised: #{e}" end never_die.resume Thread.new { main_thread.raise "interrupt2" }.join Thread.new { main_thread.raise "interrupt3" }.join p :after ``` Output is: ``` raised: interrupt1 :after ``` (I noticed these weird semantics when implementing `Thread.handle_interrupt` on TruffleRuby, and got a fairly subtle bug due to multiple `Fiber`s of the same `Thread` queuing the same interrupt multiple times in the `Thread`'s interrupt queue). -- https://bugs.ruby-lang.org/ Unsubscribe: