diff options
author | Koichi Sasada <ko1@atdot.net> | 2019-11-29 17:39:06 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2019-11-29 17:47:02 +0900 |
commit | 36da0b3da1aed77e0dffb3f54038f01ff574972b (patch) | |
tree | c314267b99a363bdd97e8025bbc586d2be8c333c /insns.def | |
parent | c4686b92359d298f281f3943ba205858e183e7af (diff) |
check interrupts at each frame pop timing.
Asynchronous events such as signal trap, finalization timing,
thread switching and so on are managed by "interrupt_flag".
Ruby's threads check this flag periodically and if a thread
does not check this flag, above events doesn't happen.
This checking is CHECK_INTS() (related) macro and it is placed
at some places (laeve instruction and so on). However, at the end
of C methods, C blocks (IMEMO_IFUNC) etc there are no checking
and it can introduce uninterruptible thread.
To modify this situation, we decide to place CHECK_INTS() at
vm_pop_frame(). It increases interrupt checking points.
[Bug #16366]
This patch can introduce unexpected events...
Diffstat (limited to 'insns.def')
-rw-r--r-- | insns.def | 3 |
1 files changed, 0 insertions, 3 deletions
@@ -935,8 +935,6 @@ leave } } - RUBY_VM_CHECK_INTS(ec); - if (vm_pop_frame(ec, GET_CFP(), GET_EP())) { #if OPT_CALL_THREADED_CODE rb_ec_thread_ptr(ec)->retval = val; @@ -963,7 +961,6 @@ throw /* Same discussion as leave. */ // attr bool leaf = false; /* has rb_threadptr_execute_interrupts() */ { - RUBY_VM_CHECK_INTS(ec); val = vm_throw(ec, GET_CFP(), throw_state, throwobj); THROW_EXCEPTION(val); /* unreachable */ |