From 36da0b3da1aed77e0dffb3f54038f01ff574972b Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Fri, 29 Nov 2019 17:39:06 +0900 Subject: 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... --- enum.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'enum.c') diff --git a/enum.c b/enum.c index a41144993e..7606e58b43 100644 --- a/enum.c +++ b/enum.c @@ -543,7 +543,6 @@ collect_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, ary)) static VALUE collect_all(RB_BLOCK_CALL_FUNC_ARGLIST(i, ary)) { - rb_thread_check_ints(); rb_ary_push(ary, rb_enum_values_pack(argc, argv)); return Qnil; @@ -663,14 +662,12 @@ static VALUE enum_to_h_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash)) { ENUM_WANT_SVALUE(); - rb_thread_check_ints(); return rb_hash_set_pair(hash, i); } static VALUE enum_to_h_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash)) { - rb_thread_check_ints(); return rb_hash_set_pair(hash, rb_yield_values2(argc, argv)); } -- cgit v1.2.3