diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | eval.c | 3 | ||||
-rw-r--r-- | test/ruby/test_thread.rb | 12 |
3 files changed, 22 insertions, 0 deletions
@@ -1,3 +1,10 @@ +Tue Nov 27 10:55:09 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com> + + * 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 <kosaki.motohiro@gmail.com> * thread.c (rb_thread_terminate_all): suppress a warning. @@ -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 |