From 36da0b3da1aed77e0dffb3f54038f01ff574972b Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Fri, 29 Nov 2019 17:39:06 +0900 Subject: check interrupts at each frame pop timing. Asynchronous events such as signal trap, finalization timing, thread switching and so on are managed by "interrupt_flag". Ruby's threads check this flag periodically and if a thread does not check this flag, above events doesn't happen. This checking is CHECK_INTS() (related) macro and it is placed at some places (laeve instruction and so on). However, at the end of C methods, C blocks (IMEMO_IFUNC) etc there are no checking and it can introduce uninterruptible thread. To modify this situation, we decide to place CHECK_INTS() at vm_pop_frame(). It increases interrupt checking points. [Bug #16366] This patch can introduce unexpected events... --- test/ruby/test_thread.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'test/ruby') diff --git a/test/ruby/test_thread.rb b/test/ruby/test_thread.rb index adfad7e7e8..9d6205979b 100644 --- a/test/ruby/test_thread.rb +++ b/test/ruby/test_thread.rb @@ -816,17 +816,19 @@ class TestThread < Test::Unit::TestCase def test_handle_interrupt_and_io assert_in_out_err([], <<-INPUT, %w(ok), []) th_waiting = true + q = Queue.new t = Thread.new { Thread.current.report_on_exception = false Thread.handle_interrupt(RuntimeError => :on_blocking) { + q << true nil while th_waiting # async interrupt should be raised _before_ writing puts arguments puts "ng" } } - Thread.pass while t.stop? + q.pop t.raise RuntimeError th_waiting = false t.join rescue nil -- cgit v1.2.3