Actions
Bug #17568
closedThread.handle_interrupt is per-Thread but should probably be per-Fiber
Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]
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).
Actions
Like0
Like0Like0Like0Like0Like0