Project

General

Profile

Actions

Bug #17568

closed

Thread.handle_interrupt is per-Thread but should probably be per-Fiber

Added by Eregon (Benoit Daloze) almost 4 years ago. Updated almost 3 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]
[ruby-core:102189]

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 Fibers 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 Fibers of the same Thread queuing the same interrupt multiple times in the Thread's interrupt queue).

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0