summaryrefslogtreecommitdiff
path: root/signal.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-16 09:39:09 (GMT)
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-16 09:39:09 (GMT)
commit01dc0a7104d09f59e5c94e286adcac7c04574eab (patch)
tree8c6a9d1c3652e1832c15c3a71bdfd83e611bc1d8 /signal.c
parent20a9bd67636a82ca83c5cef4755a8206dc34eca7 (diff)
* 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
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/signal.c b/signal.c
index f6232fd..1adcaee 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<RUBY_NSIG; i++) {
+ RARRAY_ASET(cmds, i, Qfalse);
+ }
rb_define_global_function("trap", sig_trap, -1);
rb_define_module_function(mSignal, "trap", sig_trap, -1);