summaryrefslogtreecommitdiff
path: root/ext/-test-/postponed_job/postponed_job.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2019-11-29 17:39:06 +0900
committerKoichi Sasada <ko1@atdot.net>2019-11-29 17:47:02 +0900
commit36da0b3da1aed77e0dffb3f54038f01ff574972b (patch)
treec314267b99a363bdd97e8025bbc586d2be8c333c /ext/-test-/postponed_job/postponed_job.c
parentc4686b92359d298f281f3943ba205858e183e7af (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 'ext/-test-/postponed_job/postponed_job.c')
-rw-r--r--ext/-test-/postponed_job/postponed_job.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/ext/-test-/postponed_job/postponed_job.c b/ext/-test-/postponed_job/postponed_job.c
index 157230e33bb..d8684d475a4 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;
}