summaryrefslogtreecommitdiff
path: root/spec/ruby/core/thread/raise_spec.rb
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2019-11-29 17:39:06 +0900
committerKoichi Sasada <ko1@atdot.net>2019-11-29 17:47:02 +0900
commit36da0b3da1aed77e0dffb3f54038f01ff574972b (patch)
treec314267b99a363bdd97e8025bbc586d2be8c333c /spec/ruby/core/thread/raise_spec.rb
parentc4686b92359d298f281f3943ba205858e183e7af (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 'spec/ruby/core/thread/raise_spec.rb')
-rw-r--r--spec/ruby/core/thread/raise_spec.rb3
1 files changed, 3 insertions, 0 deletions
diff --git a/spec/ruby/core/thread/raise_spec.rb b/spec/ruby/core/thread/raise_spec.rb
index 38571854ef..88a96d5f4e 100644
--- a/spec/ruby/core/thread/raise_spec.rb
+++ b/spec/ruby/core/thread/raise_spec.rb
@@ -138,11 +138,14 @@ describe "Thread#raise on a running thread" do
end
it "can go unhandled" do
+ q = Queue.new
t = Thread.new do
Thread.current.report_on_exception = false
+ q << true
loop { Thread.pass }
end
+ q.pop # wait for `report_on_exception = false`.
t.raise
-> { t.value }.should raise_error(RuntimeError)
end