Bug #17568
closedThread.handle_interrupt is per-Thread but should probably be per-Fiber
Description
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:
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).
Updated by ko1 (Koichi Sasada) over 3 years ago
I understand some case it is confusing, but if Fiber is used to represent the data structure like Enumerator, Thread-wide mask is needed.
Could you give us the example which should be fiber local?
mame-san also proposed Fiber.handle_interrupt
for fiber local handler to set fiber local setting.
Updated by mame (Yusuke Endoh) over 3 years ago
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.
Updated by jeremyevans0 (Jeremy Evans) over 3 years ago
- Status changed from Open to Feedback
Updated by Eregon (Benoit Daloze) about 3 years ago
- Status changed from Feedback to Rejected
Closing since it seems intentional for some cases (Enumerator fibers).