aboutsummaryrefslogtreecommitdiffstats
path: root/thread.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-01-07 05:49:31 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-01-07 05:49:31 +0000
commit557a00f1aa531fb480a326952365eef0fab611bd (patch)
treec2f02b87e8bb9e28a4681a2d8841ae3e96fa88e2 /thread.c
parentb032d111abc06e166b890f9f4d2a757af80116fd (diff)
downloadruby-557a00f1aa531fb480a326952365eef0fab611bd.tar.gz
thread.c: interrupt queue on uninitialized thread
* 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/trunk@53449 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/thread.c b/thread.c
index c9b13bd0c8..bc43572a34 100644
--- a/thread.c
+++ b/thread.c
@@ -1559,6 +1559,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,
@@ -1866,6 +1874,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;
}
@@ -2179,6 +2190,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 */
@@ -2223,6 +2235,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);
}