kosaki$B$G$9(B
Ruby VM internal
$B$K>$7$$J}!9$K<ALd$G$9!#8=:_!"(Bthread->interrupt_flag$B$O$I$&$d$C$FGSB>@)8f$5$l$k%G%6%$%s$K$J$C$F$$$^$9$G$7$g$&$+!)(B
$B$H$$$$$^$9$N$O(B
$B#1!%%S%C%H%^%9%/$H$7$F;H$C$F$$$k$N$GGSB>@)8f$7$J$$$H%U%i%0$,%m%9%H$7$F$($i$$;v$K$J$j$=$&(B
#define RUBY_VM_SET_INTERRUPT(th) ((th)->interrupt_flag |= 0x02)
#define RUBY_VM_SET_TIMER_INTERRUPT(th) ((th)->interrupt_flag |= 0x01)
#define RUBY_VM_SET_FINALIZER_INTERRUPT(th) ((th)->interrupt_flag |=
0x04)
#define RUBY_VM_INTERRUPTED(th) ((th)->interrupt_flag & 0x02)
$B#2!%3d$j9~$_=hM}$G%U%i%0$r%j%;%C%H$9$k2U=j$G$O(BGVL$B$7$+$H$C$F$J$$(B
static void
rb_threadptr_execute_interrupts_rec(rb_thread_t *th, int sched_depth)
{
(snip)
while (th->interrupt_flag) {
enum rb_thread_status status = th->status;
int timer_interrupt = th->interrupt_flag & 0x01;
int finalizer_interrupt = th->interrupt_flag & 0x04;
th->interrupt_flag = 0;
$B#3!%%?%$%^!<%9%l%C%I$O(BTIMER_INTERRUPT
bit$B$rN)$F$k;~$K!"(Btimer_thread_lock $B$7$+<h$C$F$J$$(B
static void
timer_thread_function(void *arg)
{
rb_vm_t vm = GET_VM(); / TODO: fix me for Multi-VM */
/* for time slice */
RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);
$B#4!%(Bthread.c $B$G$O(B RUBY_VM_SET_INTERRUPT$B8F$V$H$-$K(B
thread->interrupt_lock $B<h$k$,(B
cont.c $B$G$O<h$i$J$$(B
$B#5!%(Bgc.c$B$b(B RUBY_VM_SET_FINALIZER_INTERRUPT
$B8F$V$H$-$KFC$K%m%C%/$r<h$i$J$$(B
$B$H$$$&!"$J$+$J$+@09g@-$,$H$l$F$$$J$5$=$&$J>u67$K$J$C$F$$$=$&$@$+$i$G$9!#$J$K$+8+Mn$H$7$F$$$^$9$G$7$g$&$+!)(B
$B!t(B $B0l=V!"$9$Y$F(B
interrupt_lock$B$G<i$k$N$,$$$$$N$+$J!#$H;W$C$?$N$G$9$,$h$/9M$($?$i(B
native_mutex_lock()$B4X?t$,(B
$B!t(B thread.c $B0J30$+$i$O8F$Y$J$$$N$G$7$?!#(B