diff options
author | Koichi Sasada <ko1@atdot.net> | 2019-11-29 17:39:06 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2019-11-29 17:47:02 +0900 |
commit | 36da0b3da1aed77e0dffb3f54038f01ff574972b (patch) | |
tree | c314267b99a363bdd97e8025bbc586d2be8c333c /test | |
parent | c4686b92359d298f281f3943ba205858e183e7af (diff) |
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...
Diffstat (limited to 'test')
-rw-r--r-- | test/-ext-/postponed_job/test_postponed_job.rb | 4 | ||||
-rw-r--r-- | test/ruby/test_thread.rb | 4 |
2 files changed, 5 insertions, 3 deletions
diff --git a/test/-ext-/postponed_job/test_postponed_job.rb b/test/-ext-/postponed_job/test_postponed_job.rb index 978b728ef7..7dc28776d0 100644 --- a/test/-ext-/postponed_job/test_postponed_job.rb +++ b/test/-ext-/postponed_job/test_postponed_job.rb @@ -19,8 +19,8 @@ class TestPostponed_job < Test::Unit::TestCase Bug.postponed_job_call_direct_wrapper(direct) Bug.postponed_job_register_wrapper(registered) - assert_match( /postponed_job_call_direct_wrapper/, direct.join) - assert_not_match( /postponed_job_register_wrapper/, registered.join) + assert_equal([0], direct) + assert_equal([3], registered) Bug.postponed_job_register_one(ary = []) assert_equal [1], ary 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 |