From a79fe07db6c2de7a477613f8cd5c9c51322367bf Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Wed, 25 Nov 2020 15:00:26 +0900 Subject: show the error message before Ractor.yield Ractor's error will be printed if Thread#report_on_exception is true (default), and error message is used. Without this patch, the exception object is sent by Ractor.yield and it can be shared with another ractor. http://ci.rvm.jp/results/trunk-random3@phosphorus-docker/3269368 To prevent such sharing, show errors befor Ractor.yield(). --- thread.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/thread.c b/thread.c index 674737640f..964f4328dd 100644 --- a/thread.c +++ b/thread.c @@ -831,18 +831,19 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start) /* exit on main_thread. */ } else { - if (th->invoke_type == thread_invoke_type_ractor_proc) { - rb_ractor_atexit_exception(th->ec); - } - if (th->report_on_exception) { VALUE mesg = rb_thread_to_s(th->self); rb_str_cat_cstr(mesg, " terminated with exception (report_on_exception is true):\n"); rb_write_error_str(mesg); rb_ec_error_print(th->ec, errinfo); } - if (th->vm->thread_abort_on_exception || - th->abort_on_exception || RTEST(ruby_debug)) { + + if (th->invoke_type == thread_invoke_type_ractor_proc) { + rb_ractor_atexit_exception(th->ec); + } + + if (th->vm->thread_abort_on_exception || + th->abort_on_exception || RTEST(ruby_debug)) { /* exit on main_thread */ } else { -- cgit v1.2.3