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... --- ext/-test-/postponed_job/postponed_job.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'ext/-test-/postponed_job/postponed_job.c') diff --git a/ext/-test-/postponed_job/postponed_job.c b/ext/-test-/postponed_job/postponed_job.c index 157230e33b..d8684d475a 100644 --- a/ext/-test-/postponed_job/postponed_job.c +++ b/ext/-test-/postponed_job/postponed_job.c @@ -1,19 +1,28 @@ #include "ruby.h" #include "ruby/debug.h" +static int counter; + static void pjob_callback(void *data) { VALUE ary = (VALUE)data; Check_Type(ary, T_ARRAY); - rb_ary_replace(ary, rb_funcall(Qnil, rb_intern("caller"), 0)); + rb_ary_push(ary, INT2FIX(counter)); } static VALUE pjob_register(VALUE self, VALUE obj) { + counter = 0; rb_postponed_job_register(0, pjob_callback, (void *)obj); + rb_gc_start(); + counter++; + rb_gc_start(); + counter++; + rb_gc_start(); + counter++; return self; } @@ -38,7 +47,14 @@ pjob_register_one(VALUE self, VALUE obj) static VALUE pjob_call_direct(VALUE self, VALUE obj) { + counter = 0; pjob_callback((void *)obj); + rb_gc_start(); + counter++; + rb_gc_start(); + counter++; + rb_gc_start(); + counter++; return self; } -- cgit v1.2.3