From 01dc0a7104d09f59e5c94e286adcac7c04574eab Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 16 Jul 2014 09:39:09 +0000 Subject: * vm_core.h: remove rb_vm_t::trap_list[RUBY_NSIG], but add rb_vm_t::trap_list_cmds (an array) and rb_vm_t::trap_list_safes[RUBY_NSIG] (separate to two different array). This modification reduce root objects. * signal.c: ditto. * vm.c (rb_vm_mark): remove marking code for rb_vm_t::trap_list. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46834 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- signal.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'signal.c') diff --git a/signal.c b/signal.c index f6232fdf75..1adcaee73a 100644 --- a/signal.c +++ b/signal.c @@ -861,15 +861,17 @@ signal_exec(VALUE cmd, int safe, int sig) } } +#define TRAP_LIST_CMD(vm, sig) RARRAY_AREF((vm)->trap_list_cmds, (sig)) +#define TRAP_LIST_SAFE(vm, sig) ((vm)->trap_list_safes[sig]) void rb_trap_exit(void) { rb_vm_t *vm = GET_VM(); - VALUE trap_exit = vm->trap_list[0].cmd; + VALUE trap_exit = TRAP_LIST_CMD(vm, 0); if (trap_exit) { - vm->trap_list[0].cmd = 0; - signal_exec(trap_exit, vm->trap_list[0].safe, 0); + RARRAY_ASET(vm->trap_list_cmds, 0, Qfalse); + signal_exec(trap_exit, TRAP_LIST_SAFE(vm, 0), 0); } } @@ -877,8 +879,8 @@ void rb_signal_exec(rb_thread_t *th, int sig) { rb_vm_t *vm = GET_VM(); - VALUE cmd = vm->trap_list[sig].cmd; - int safe = vm->trap_list[sig].safe; + VALUE cmd = TRAP_LIST_CMD(vm, sig); + int safe = TRAP_LIST_SAFE(vm, sig); if (cmd == 0) { switch (sig) { @@ -1074,7 +1076,7 @@ trap(int sig, sighandler_t func, VALUE command) * RUBY_VM_CHECK_INTS(). */ oldfunc = ruby_signal(sig, func); - oldcmd = vm->trap_list[sig].cmd; + oldcmd = TRAP_LIST_CMD(vm, sig); switch (oldcmd) { case 0: case Qtrue: @@ -1090,8 +1092,8 @@ trap(int sig, sighandler_t func, VALUE command) break; } - vm->trap_list[sig].cmd = command; - vm->trap_list[sig].safe = rb_safe_level(); + RARRAY_ASET(vm->trap_list_cmds, sig, command); + vm->trap_list_safes[sig] = rb_safe_level(); return oldcmd; } @@ -1240,7 +1242,7 @@ init_sigchld(int sig) ruby_signal(sig, oldfunc); } else { - GET_VM()->trap_list[sig].cmd = 0; + RARRAY_ASET(GET_VM()->trap_list_cmds, sig, Qfalse); } rb_enable_interrupt(); } @@ -1304,6 +1306,13 @@ void Init_signal(void) { VALUE mSignal = rb_define_module("Signal"); + int i; + VALUE cmds = GET_VM()->trap_list_cmds = rb_ary_tmp_new(RUBY_NSIG); + + rb_gc_register_mark_object(cmds); + for (i=0; i