From 9ace5c122e9ad5203e98590adfc3896464b67ec1 Mon Sep 17 00:00:00 2001 From: kosaki Date: Tue, 27 Nov 2012 02:00:40 +0000 Subject: * eval.c (ruby_cleanup): set thread status to THREAD_KILLED for preventing thr.raise. * test/ruby/test_thread.rb (test_main_thread_status_at_exit): test for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37886 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ eval.c | 3 +++ test/ruby/test_thread.rb | 12 ++++++++++++ 3 files changed, 22 insertions(+) diff --git a/ChangeLog b/ChangeLog index 8ad83433bf..d24cc23df3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Nov 27 10:55:09 2012 KOSAKI Motohiro + + * eval.c (ruby_cleanup): set thread status to THREAD_KILLED + for preventing thr.raise. + * test/ruby/test_thread.rb (test_main_thread_status_at_exit): + test for the above. + Tue Nov 27 10:31:29 2012 KOSAKI Motohiro * thread.c (rb_thread_terminate_all): suppress a warning. diff --git a/eval.c b/eval.c index 2cdc88acc9..35202ce07b 100644 --- a/eval.c +++ b/eval.c @@ -159,6 +159,9 @@ ruby_cleanup(volatile int ex) rb_thread_t *th = GET_THREAD(); int nerr; + /* protect from thread.raise */ + th->status = THREAD_KILLED; + rb_threadptr_interrupt(th); rb_threadptr_check_signal(th); PUSH_TAG(); diff --git a/test/ruby/test_thread.rb b/test/ruby/test_thread.rb index fb2efec552..13d1a3ff65 100644 --- a/test/ruby/test_thread.rb +++ b/test/ruby/test_thread.rb @@ -889,4 +889,16 @@ class TestThreadGroup < Test::Unit::TestCase }.join end end + + def test_main_thread_status_at_exit + assert_in_out_err([], <<-INPUT, %w(false), []) +Thread.new(Thread.current) {|mth| + begin + sleep 0.1 + ensure + p mth.alive? + end +} + INPUT + end end -- cgit v1.2.3