mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
36da0b3da1
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...
28 lines
632 B
Ruby
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
|