Project

General

Profile

Bug #5993 » thread_exit_in_fiber.patch

nagachika (Tomoyuki Chikanaga), 12/19/2012 02:31 AM

View differences:

cont.c
if (state == TAG_RAISE) {
rb_threadptr_async_errinfo_enque(th, th->errinfo);
}
else if (state == TAG_FATAL) {
rb_threadptr_async_errinfo_enque(th, th->errinfo);
}
else {
VALUE err = rb_vm_make_jump_tag_but_local_jump(state, th->errinfo);
if (!NIL_P(err))
test/ruby/test_fiber.rb
def test_exit_in_fiber
bug5993 = '[ruby-dev:45218]'
assert_nothing_raised(bug5993) do
Thread.new{ Fiber.new{ Thread.exit }.resume }.join
Thread.new{ Fiber.new{ Thread.exit }.resume; raise "unreachable" }.join
end
end
thread.c
if (err == Qundef) {
/* no error */
}
else if (err == eKillSignal /* Thread#kill receieved */ ||
err == eTerminateSignal /* Terminate thread */ ) {
else if (err == eKillSignal /* Thread#kill receieved */ ||
err == eTerminateSignal /* Terminate thread */ ||
err == INT2FIX(TAG_FATAL) /* Thread.exit etc. */ ) {
rb_threadptr_to_kill(th);
}
else {
vm.c
case TAG_RETRY:
result = make_localjump_error("retry outside of rescue clause", Qnil, state);
break;
case TAG_FATAL:
/* internal exception or Thread.exit */
/* Thread.exit set th->errinfo to INT2FIX(TAG_FATAL) */
if (!FIXNUM_P(val))
result = val;
default:
break;
}
    (1-1/1)