mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
should check pending interrupts correctly.
rb_uninterruptible() disables any interrupts using handle_interrupt feature (This function is used by `p`). After this function, pending interrupts should be checked correctly, however there is no chance to setup interrupt flag of working threads, it means that nobody checks pending interrupts. For example, it ignores terminate signal delivered at the end of main thread and program can't stop. This patch set interrupt flag if there are pending interrupts.
This commit is contained in:
parent
d2bb2e066b
commit
fd0222caed
2 changed files with 31 additions and 1 deletions
|
@ -484,3 +484,17 @@ assert_equal 'foo', %q{
|
|||
GC.start
|
||||
f.call.source
|
||||
}
|
||||
assert_normal_exit %q{
|
||||
class C
|
||||
def inspect
|
||||
sleep 0.5
|
||||
'C!!'
|
||||
end
|
||||
end
|
||||
Thread.new{
|
||||
loop{
|
||||
p C.new
|
||||
}
|
||||
}
|
||||
sleep 0.1
|
||||
}, timeout: 5
|
||||
|
|
18
thread.c
18
thread.c
|
@ -5564,6 +5564,19 @@ rb_default_coverage(int n)
|
|||
return coverage;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
uninterruptible_exit(VALUE v)
|
||||
{
|
||||
rb_thread_t *cur_th = GET_THREAD();
|
||||
rb_ary_pop(cur_th->pending_interrupt_mask_stack);
|
||||
|
||||
cur_th->pending_interrupt_queue_checked = 0;
|
||||
if (!rb_threadptr_pending_interrupt_empty_p(cur_th)) {
|
||||
RUBY_VM_SET_INTERRUPT(cur_th->ec);
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_uninterruptible(VALUE (*b_proc)(VALUE), VALUE data)
|
||||
{
|
||||
|
@ -5574,5 +5587,8 @@ rb_uninterruptible(VALUE (*b_proc)(VALUE), VALUE data)
|
|||
OBJ_FREEZE_RAW(interrupt_mask);
|
||||
rb_ary_push(cur_th->pending_interrupt_mask_stack, interrupt_mask);
|
||||
|
||||
return rb_ensure(b_proc, data, rb_ary_pop, cur_th->pending_interrupt_mask_stack);
|
||||
VALUE ret = rb_ensure(b_proc, data, uninterruptible_exit, Qnil);
|
||||
|
||||
RUBY_VM_CHECK_INTS(cur_th->ec);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue