1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
ko1 2014-07-16 09:39:09 +00:00
parent 20a9bd6763
commit 01dc0a7104
4 changed files with 33 additions and 20 deletions

View file

@ -1,3 +1,16 @@
Wed Jul 16 18:34:47 2014 Koichi Sasada <ko1@atdot.net>
* 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.
Wed Jul 16 18:08:47 2014 Koichi Sasada <ko1@atdot.net>
* iseq.c (rb_iseq_defined_string): use rb_gc_mark_object() instead of

View file

@ -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);

7
vm.c
View file

@ -1737,8 +1737,6 @@ void rb_vm_trace_mark_event_hooks(rb_hook_list_t *hooks);
void
rb_vm_mark(void *ptr)
{
int i;
RUBY_MARK_ENTER("vm");
RUBY_GC_INFO("-------------------------------------------------\n");
if (ptr) {
@ -1766,11 +1764,6 @@ rb_vm_mark(void *ptr)
}
rb_vm_trace_mark_event_hooks(&vm->event_hooks);
for (i = 0; i < RUBY_NSIG; i++) {
if (vm->trap_list[i].cmd)
rb_gc_mark(vm->trap_list[i].cmd);
}
}
RUBY_MARK_LEAVE("vm");

View file

@ -364,10 +364,8 @@ typedef struct rb_vm_struct {
struct st_table *loading_table;
/* signal */
struct {
VALUE cmd;
int safe;
} trap_list[RUBY_NSIG];
VALUE trap_list_cmds; /* an Array object */
int trap_list_safes[RUBY_NSIG];
/* hook */
rb_hook_list_t event_hooks;