1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/-ext-/postponed_job/test_postponed_job.rb
Koichi Sasada 36da0b3da1 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...
2019-11-29 17:47:02 +09:00

28 lines
632 B
Ruby

# frozen_string_literal: false
require 'test/unit'
require '-test-/postponed_job'
module Bug
def self.postponed_job_call_direct_wrapper(*args)
postponed_job_call_direct(*args)
end
def self.postponed_job_register_wrapper(*args)
postponed_job_register(*args)
end
end
class TestPostponed_job < Test::Unit::TestCase
def test_register
direct, registered = [], []
Bug.postponed_job_call_direct_wrapper(direct)
Bug.postponed_job_register_wrapper(registered)
assert_equal([0], direct)
assert_equal([3], registered)
Bug.postponed_job_register_one(ary = [])
assert_equal [1], ary
end
end