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().
This commit is contained in:
parent
fed67fe6b2
commit
a79fe07db6
9
thread.c
9
thread.c
@ -831,16 +831,17 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start)
|
|||||||
/* exit on main_thread. */
|
/* exit on main_thread. */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (th->invoke_type == thread_invoke_type_ractor_proc) {
|
|
||||||
rb_ractor_atexit_exception(th->ec);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (th->report_on_exception) {
|
if (th->report_on_exception) {
|
||||||
VALUE mesg = rb_thread_to_s(th->self);
|
VALUE mesg = rb_thread_to_s(th->self);
|
||||||
rb_str_cat_cstr(mesg, " terminated with exception (report_on_exception is true):\n");
|
rb_str_cat_cstr(mesg, " terminated with exception (report_on_exception is true):\n");
|
||||||
rb_write_error_str(mesg);
|
rb_write_error_str(mesg);
|
||||||
rb_ec_error_print(th->ec, errinfo);
|
rb_ec_error_print(th->ec, errinfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (th->invoke_type == thread_invoke_type_ractor_proc) {
|
||||||
|
rb_ractor_atexit_exception(th->ec);
|
||||||
|
}
|
||||||
|
|
||||||
if (th->vm->thread_abort_on_exception ||
|
if (th->vm->thread_abort_on_exception ||
|
||||||
th->abort_on_exception || RTEST(ruby_debug)) {
|
th->abort_on_exception || RTEST(ruby_debug)) {
|
||||||
/* exit on main_thread */
|
/* exit on main_thread */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user