ruby-changes:44653
From: usa <ko1@a...>
Date: Sat, 12 Nov 2016 07:33:26 +0900 (JST)
Subject: [ruby-changes:44653] usa:r56726 (ruby_2_2): merge revision(s) 53449: [Backport #11959]
usa 2016-11-12 07:33:21 +0900 (Sat, 12 Nov 2016) New Revision: 56726 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=56726 Log: merge revision(s) 53449: [Backport #11959] * thread.c (rb_thread_pending_interrupt_p): no pending interrupt before initialization. * thread.c (thread_raise_m, rb_thread_kill): uninitialized thread cannot interrupt. [ruby-core:72732] [Bug #11959] Modified directories: branches/ruby_2_2/ Modified files: branches/ruby_2_2/ChangeLog branches/ruby_2_2/test/ruby/test_thread.rb branches/ruby_2_2/thread.c branches/ruby_2_2/version.h Index: ruby_2_2/thread.c =================================================================== --- ruby_2_2/thread.c (revision 56725) +++ ruby_2_2/thread.c (revision 56726) @@ -1546,6 +1546,14 @@ rb_threadptr_pending_interrupt_enque(rb_ https://github.com/ruby/ruby/blob/trunk/ruby_2_2/thread.c#L1546 th->pending_interrupt_queue_checked = 0; } +static void +threadptr_check_pending_interrupt_queue(rb_thread_t *th) +{ + if (!th->pending_interrupt_queue) { + rb_raise(rb_eThreadError, "uninitialized thread"); + } +} + enum handle_interrupt_timing { INTERRUPT_NONE, INTERRUPT_IMMEDIATE, @@ -1841,6 +1849,9 @@ rb_thread_pending_interrupt_p(int argc, https://github.com/ruby/ruby/blob/trunk/ruby_2_2/thread.c#L1849 GetThreadPtr(target_thread, target_th); + if (!target_th->pending_interrupt_queue) { + return Qfalse; + } if (rb_threadptr_pending_interrupt_empty_p(target_th)) { return Qfalse; } @@ -2154,6 +2165,7 @@ thread_raise_m(int argc, VALUE *argv, VA https://github.com/ruby/ruby/blob/trunk/ruby_2_2/thread.c#L2165 rb_thread_t *target_th; rb_thread_t *th = GET_THREAD(); GetThreadPtr(self, target_th); + threadptr_check_pending_interrupt_queue(target_th); rb_threadptr_raise(target_th, argc, argv); /* To perform Thread.current.raise as Kernel.raise */ @@ -2198,6 +2210,7 @@ rb_thread_kill(VALUE thread) https://github.com/ruby/ruby/blob/trunk/ruby_2_2/thread.c#L2210 rb_threadptr_to_kill(th); } else { + threadptr_check_pending_interrupt_queue(th); rb_threadptr_pending_interrupt_enque(th, eKillSignal); rb_threadptr_interrupt(th); } Index: ruby_2_2/version.h =================================================================== --- ruby_2_2/version.h (revision 56725) +++ ruby_2_2/version.h (revision 56726) @@ -1,10 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_2/version.h#L1 #define RUBY_VERSION "2.2.6" -#define RUBY_RELEASE_DATE "2016-10-27" -#define RUBY_PATCHLEVEL 384 +#define RUBY_RELEASE_DATE "2016-11-12" +#define RUBY_PATCHLEVEL 385 #define RUBY_RELEASE_YEAR 2016 -#define RUBY_RELEASE_MONTH 10 -#define RUBY_RELEASE_DAY 27 +#define RUBY_RELEASE_MONTH 11 +#define RUBY_RELEASE_DAY 12 #include "ruby/version.h" Index: ruby_2_2/test/ruby/test_thread.rb =================================================================== --- ruby_2_2/test/ruby/test_thread.rb (revision 56725) +++ ruby_2_2/test/ruby/test_thread.rb (revision 56726) @@ -744,9 +744,24 @@ _eom https://github.com/ruby/ruby/blob/trunk/ruby_2_2/test/ruby/test_thread.rb#L744 end def test_uninitialized - c = Class.new(Thread) - c.class_eval { def initialize; end } + c = Class.new(Thread) {def initialize; end} assert_raise(ThreadError) { c.new.start } + + bug11959 = '[ruby-core:72732] [Bug #11959]' + + c = Class.new(Thread) {def initialize; exit; end} + assert_raise(ThreadError, bug11959) { c.new } + + c = Class.new(Thread) {def initialize; raise; end} + assert_raise(ThreadError, bug11959) { c.new } + + c = Class.new(Thread) { + def initialize + pending = pending_interrupt? + super {pending} + end + } + assert_equal(false, c.new.value, bug11959) end def test_backtrace Index: ruby_2_2/ChangeLog =================================================================== --- ruby_2_2/ChangeLog (revision 56725) +++ ruby_2_2/ChangeLog (revision 56726) @@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_2/ChangeLog#L1 +Sat Nov 12 07:32:23 2016 Nobuyoshi Nakada <nobu@r...> + + * thread.c (rb_thread_pending_interrupt_p): no pending interrupt + before initialization. + + * thread.c (thread_raise_m, rb_thread_kill): uninitialized thread + cannot interrupt. [ruby-core:72732] [Bug #11959] + Thu Oct 27 16:47:57 2016 Kazuki Yamaguchi <k@r...> * eval_intern.h (TH_PUSH_TAG): Initialize struct rb_vm_tag::tag with Property changes on: ruby_2_2 ___________________________________________________________________ Modified: svn:mergeinfo Merged /trunk:r53449 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/