diff options
author | Koichi Sasada <[email protected]> | 2020-11-25 15:00:26 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2020-11-25 15:08:10 +0900 |
commit | a79fe07db6c2de7a477613f8cd5c9c51322367bf (patch) | |
tree | a44aa4c8f599e48154d4d5496e548c2a7e3f732f /thread.c | |
parent | fed67fe6b277361940e3357c8b1ffa455d7f2339 (diff) |
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().
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -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 { |