mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
thread.c: set cause by Thread#raise
* thread.c (rb_threadptr_raise): set cause from the called thread, but not from the thread to be interrupted. [ruby-core:77222] [Bug #12741] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56125 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b5f3a113f5
commit
646c53895f
4 changed files with 66 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Fri Sep 9 17:59:46 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* thread.c (rb_threadptr_raise): set cause from the called thread,
|
||||||
|
but not from the thread to be interrupted.
|
||||||
|
[ruby-core:77222] [Bug #12741]
|
||||||
|
|
||||||
Fri Sep 9 13:50:05 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Fri Sep 9 13:50:05 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* doc/extension.rdoc, doc/extension.ja.rdoc: fix file name.
|
* doc/extension.rdoc, doc/extension.ja.rdoc: fix file name.
|
||||||
|
|
11
eval.c
11
eval.c
|
@ -567,6 +567,17 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg, VALUE cause)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rb_threadptr_setup_exception(rb_thread_t *th, VALUE mesg, VALUE cause)
|
||||||
|
{
|
||||||
|
if (cause == Qundef) {
|
||||||
|
cause = get_thread_errinfo(th);
|
||||||
|
}
|
||||||
|
if (cause != mesg) {
|
||||||
|
rb_ivar_set(mesg, id_cause, cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_longjmp(int tag, volatile VALUE mesg, VALUE cause)
|
rb_longjmp(int tag, volatile VALUE mesg, VALUE cause)
|
||||||
{
|
{
|
||||||
|
|
|
@ -698,6 +698,52 @@ end.join
|
||||||
assert_nil(e.cause.cause)
|
assert_nil(e.cause.cause)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_cause_thread_no_cause
|
||||||
|
bug12741 = '[ruby-core:77222] [Bug #12741]'
|
||||||
|
|
||||||
|
x = Thread.current
|
||||||
|
a = false
|
||||||
|
y = Thread.start do
|
||||||
|
Thread.pass until a
|
||||||
|
x.raise "stop"
|
||||||
|
end
|
||||||
|
|
||||||
|
begin
|
||||||
|
raise bug12741
|
||||||
|
rescue
|
||||||
|
e = assert_raise_with_message(RuntimeError, "stop") do
|
||||||
|
a = true
|
||||||
|
sleep 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assert_nil(e.cause)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_cause_thread_with_cause
|
||||||
|
bug12741 = '[ruby-core:77222] [Bug #12741]'
|
||||||
|
|
||||||
|
x = Thread.current
|
||||||
|
a = false
|
||||||
|
y = Thread.start do
|
||||||
|
Thread.pass until a
|
||||||
|
begin
|
||||||
|
raise "caller's cause"
|
||||||
|
rescue
|
||||||
|
x.raise "stop"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
begin
|
||||||
|
raise bug12741
|
||||||
|
rescue
|
||||||
|
e = assert_raise_with_message(RuntimeError, "stop") do
|
||||||
|
a = true
|
||||||
|
sleep 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assert_equal("caller's cause", e.cause.message)
|
||||||
|
end
|
||||||
|
|
||||||
def test_unknown_option
|
def test_unknown_option
|
||||||
bug = '[ruby-core:63203] [Feature #8257] should pass unknown options'
|
bug = '[ruby-core:63203] [Feature #8257] should pass unknown options'
|
||||||
|
|
||||||
|
|
3
thread.c
3
thread.c
|
@ -2084,6 +2084,8 @@ rb_threadptr_ready(rb_thread_t *th)
|
||||||
rb_threadptr_interrupt(th);
|
rb_threadptr_interrupt(th);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rb_threadptr_setup_exception(rb_thread_t *th, VALUE mesg, VALUE cause);
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
rb_threadptr_raise(rb_thread_t *th, int argc, VALUE *argv)
|
rb_threadptr_raise(rb_thread_t *th, int argc, VALUE *argv)
|
||||||
{
|
{
|
||||||
|
@ -2099,6 +2101,7 @@ rb_threadptr_raise(rb_thread_t *th, int argc, VALUE *argv)
|
||||||
else {
|
else {
|
||||||
exc = rb_make_exception(argc, argv);
|
exc = rb_make_exception(argc, argv);
|
||||||
}
|
}
|
||||||
|
rb_threadptr_setup_exception(GET_THREAD(), exc, Qundef);
|
||||||
rb_threadptr_pending_interrupt_enque(th, exc);
|
rb_threadptr_pending_interrupt_enque(th, exc);
|
||||||
rb_threadptr_interrupt(th);
|
rb_threadptr_interrupt(th);
|
||||||
return Qnil;
|
return Qnil;
|
||||||
|
|
Loading…
Add table
Reference in a new issue