diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-11-05 02:44:06 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-11-05 02:44:06 +0000 |
commit | 564082796ac2372ff211ad927e32596ec665ad06 (patch) | |
tree | 58d4656a998ec20595bb2cf3dab5f2ec554f752a /thread.c | |
parent | d56ccddb31a3b64bb1fcfd2257c477f37a7d72f6 (diff) |
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]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@56564 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -1561,6 +1561,14 @@ rb_threadptr_pending_interrupt_enque(rb_thread_t *th, VALUE v) 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, @@ -1868,6 +1876,9 @@ rb_thread_pending_interrupt_p(int argc, VALUE *argv, VALUE target_thread) GetThreadPtr(target_thread, target_th); + if (!target_th->pending_interrupt_queue) { + return Qfalse; + } if (rb_threadptr_pending_interrupt_empty_p(target_th)) { return Qfalse; } @@ -2181,6 +2192,7 @@ thread_raise_m(int argc, VALUE *argv, VALUE self) 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 */ @@ -2225,6 +2237,7 @@ rb_thread_kill(VALUE thread) rb_threadptr_to_kill(th); } else { + threadptr_check_pending_interrupt_queue(th); rb_threadptr_pending_interrupt_enque(th, eKillSignal); rb_threadptr_interrupt(th); } |