Bug #5993 » thread_exit_in_fiber.patch
| 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;
|
||
|
}
|
||