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