ruby-changes:7427
From: nobu <ko1@a...>
Date: Sat, 30 Aug 2008 16:39:01 +0900 (JST)
Subject: [ruby-changes:7427] Ruby:r18946 (mvm): * vm_core.h (struct rb_vm_struct): replaced signal staff with trap
nobu 2008-08-30 16:38:43 +0900 (Sat, 30 Aug 2008) New Revision: 18946 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18946 Log: * vm_core.h (struct rb_vm_struct): replaced signal staff with trap staff. * signal.c (signal_buff): per process resouce now. * signal.c (trap_list): moved to VM. * signal.c (rb_get_next_signal): reverted. * signal.c (rb_trap_exit): trap_pending_list was no longer used. * thread.c (timer_thread_function): delivers buffered per-process signals to each VMs. * vm.c (rb_vm_mark): marks trap_list. Modified files: branches/mvm/ChangeLog branches/mvm/gc.c branches/mvm/include/ruby/intern.h branches/mvm/include/ruby/signal.h branches/mvm/signal.c branches/mvm/thread.c branches/mvm/vm.c branches/mvm/vm_core.h Index: mvm/include/ruby/intern.h =================================================================== --- mvm/include/ruby/intern.h (revision 18945) +++ mvm/include/ruby/intern.h (revision 18946) @@ -514,14 +514,12 @@ void ruby_incpush(const char*); /* signal.c */ VALUE rb_f_kill(int, VALUE*); -void rb_gc_mark_trap_list(void); #ifdef POSIX_SIGNAL #define posix_signal ruby_posix_signal RETSIGTYPE (*posix_signal(int, RETSIGTYPE (*)(int)))(int); #endif void ruby_sig_finalize(void); void rb_trap_exit(void); -void rb_trap_exec(void); const char *ruby_signal_name(int); void ruby_default_signal(int); /* sprintf.c */ Index: mvm/include/ruby/signal.h =================================================================== --- mvm/include/ruby/signal.h (revision 18945) +++ mvm/include/ruby/signal.h (revision 18946) @@ -9,8 +9,8 @@ **********************************************************************/ -#ifndef RUBYSIG_H -#define RUBYSIG_H 1 +#ifndef RUBY_SIGNAL_H +#define RUBY_SIGNAL_H 1 #if defined(__cplusplus) extern "C" { @@ -76,7 +76,6 @@ VALUE rb_with_disable_interrupt(VALUE(*)(ANYARGS),VALUE); -RUBY_EXTERN rb_atomic_t rb_trap_pending; void rb_trap_restore_mask(void); RUBY_EXTERN int rb_thread_critical; @@ -89,4 +88,4 @@ } /* extern "C" { */ #endif -#endif /* RUBYSIG_H */ +#endif /* RUBY_SIGNAL_H */ Index: mvm/ChangeLog =================================================================== --- mvm/ChangeLog (revision 18945) +++ mvm/ChangeLog (revision 18946) @@ -1,3 +1,21 @@ +Sat Aug 30 16:38:23 2008 <nobu@r...> + + * vm_core.h (struct rb_vm_struct): replaced signal staff with trap + staff. + + * signal.c (signal_buff): per process resouce now. + + * signal.c (trap_list): moved to VM. + + * signal.c (rb_get_next_signal): reverted. + + * signal.c (rb_trap_exit): trap_pending_list was no longer used. + + * thread.c (timer_thread_function): delivers buffered per-process + signals to each VMs. + + * vm.c (rb_vm_mark): marks trap_list. + Sat Aug 30 10:46:44 2008 Koichi Sasada <ko1@a...> * ext/iconv/iconv.c: remove include pragma for "ruby/intern.h". Index: mvm/vm_core.h =================================================================== --- mvm/vm_core.h (revision 18945) +++ mvm/vm_core.h (revision 18946) @@ -40,6 +40,8 @@ #ifndef NSIG # ifdef DJGPP # define NSIG SIGMAX +# elif defined MACOS_UNUSE_SIGNAL +# define NSIG 1 # else # define NSIG (_SIGMAX + 1) /* For QNX */ # endif @@ -336,13 +338,12 @@ VALUE load_path; VALUE loaded_features; struct st_table *loading_table; - + /* signal */ struct { - rb_thread_lock_t lock; - rb_atomic_t buff[RUBY_NSIG]; - rb_atomic_t buffered_size; - } signal; + VALUE cmd; + int safe; + } trap_list[RUBY_NSIG]; /* hook */ rb_event_hook_t *event_hooks; Index: mvm/thread.c =================================================================== --- mvm/thread.c (revision 18945) +++ mvm/thread.c (revision 18946) @@ -2247,28 +2247,36 @@ * */ -int ruby_vm_get_next_signal(rb_vm_t *vm); +int rb_get_next_signal(void); static int -vm_timer_thread_function(rb_vm_t *vm, void *arg) +vm_set_timer_interrupt(rb_vm_t *vm, void *dummy) { - /* for time slice */ RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread); + return Qtrue; +} - /* check signal */ - if (vm->signal.buffered_size && vm->main_thread->exec_signal == 0) { +static int +vm_send_signal(rb_vm_t *vm, void *sig) +{ + if (vm->main_thread->exec_signal == 0) { rb_thread_t *mth = vm->main_thread; enum rb_thread_status prev_status = mth->status; - mth->exec_signal = ruby_vm_get_next_signal(vm); - thread_debug("main_thread: %s\n", thread_status_name(prev_status)); - thread_debug("buffered_signal_size: %ld, sig: %d\n", - (long)vm->signal.buffered_size, vm->main_thread->exec_signal); + mth->exec_signal = (VALUE)sig; + thread_debug("main_thread: %s, sig: %d\n", + thread_status_name(prev_status), + vm->main_thread->exec_signal); if (mth->status != THREAD_KILLED) mth->status = THREAD_RUNNABLE; rb_thread_interrupt(mth); mth->status = prev_status; } + return Qtrue; +} #if 0 +static int +vm_prove_profile(rb_vm_t *vm, void *sig) +{ /* prove profiler */ if (vm->prove_profile.enable) { rb_thread_t *th = vm->running_thread; @@ -2277,15 +2285,26 @@ /* GC prove profiling */ } } -#endif - return Qtrue; } +#endif static void timer_thread_function(void *arg) { - ruby_vm_foreach(vm_timer_thread_function, arg); + int sig; + + /* for time slice */ + ruby_vm_foreach(vm_set_timer_interrupt, 0); + + /* check signal */ + while ((sig = rb_get_next_signal()) > 0) { + ruby_vm_foreach(vm_send_signal, (void *)(VALUE)sig); + } + +#if 0 + ruby_vm_foreach(vm_prove_profile, 0); +#endif } void Index: mvm/gc.c =================================================================== --- mvm/gc.c (revision 18945) +++ mvm/gc.c (revision 18946) @@ -1978,8 +1978,6 @@ rb_gc_mark_maybe(*list->varptr); } - rb_gc_mark_trap_list(); - /* mark generic instance variables for special constants */ rb_mark_generic_ivar_tbl(); Index: mvm/vm.c =================================================================== --- mvm/vm.c (revision 18945) +++ mvm/vm.c (revision 18946) @@ -1426,6 +1426,8 @@ void rb_vm_mark(void *ptr) { + int i; + RUBY_MARK_ENTER("vm"); RUBY_GC_INFO("-------------------------------------------------\n"); if (ptr) { @@ -1448,6 +1450,11 @@ rb_mark_end_proc(vm->end_procs); 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"); @@ -1462,7 +1469,6 @@ { MEMZERO(vm, rb_vm_t, 1); ruby_native_thread_lock_initialize(&vm->global_vm_lock); - ruby_native_thread_lock_initialize(&vm->signal.lock); vm->objspace = rb_objspace_alloc(); vm->src_encoding_index = -1; vm->global_state_version = 1; @@ -1474,31 +1480,9 @@ ruby_vm_send_signal(rb_vm_t *vm, int sig) { if (sig <= 0 || sig >= RUBY_NSIG) return -1; - ruby_native_thread_lock(&vm->signal.lock); - ATOMIC_INC(vm->signal.buff[sig]); - ATOMIC_INC(vm->signal.buffered_size); - ruby_native_thread_unlock(&vm->signal.lock); return sig; } -int -ruby_vm_get_next_signal(rb_vm_t *vm) -{ - int i, sig = 0; - - ruby_native_thread_lock(&vm->signal.lock); - for (i = 1; i < RUBY_NSIG; i++) { - if (vm->signal.buff[i] > 0) { - ATOMIC_DEC(vm->signal.buff[i]); - ATOMIC_DEC(vm->signal.buffered_size); - sig = i; - break; - } - } - ruby_native_thread_unlock(&vm->signal.lock); - return sig; -} - /* Thread */ #define USE_THREAD_DATA_RECYCLE 1 Index: mvm/signal.c =================================================================== --- mvm/signal.c (revision 18945) +++ mvm/signal.c (revision 18946) @@ -390,37 +390,17 @@ return INT2FIX(i-1); } -static struct { - VALUE cmd; - int safe; -} trap_list[NSIG]; -static rb_atomic_t trap_pending_list[NSIG]; +struct { + rb_atomic_t cnt[RUBY_NSIG]; + rb_atomic_t size; +} signal_buff; + #if 0 static char rb_trap_accept_nativethreads[NSIG]; #endif -rb_atomic_t rb_trap_pending; rb_atomic_t rb_trap_immediate; int rb_prohibit_interrupt = 1; -VALUE -rb_get_trap_cmd(int sig) -{ - return trap_list[sig].cmd; -} - -void -rb_gc_mark_trap_list(void) -{ -#ifndef MACOS_UNUSE_SIGNAL - int i; - - for (i=0; i<NSIG; i++) { - if (trap_list[i].cmd) - rb_gc_mark(trap_list[i].cmd); - } -#endif /* MACOS_UNUSE_SIGNAL */ -} - #ifdef __dietlibc__ #define sighandler_t sh_t #endif @@ -508,19 +488,11 @@ #endif #endif -int ruby_vm_send_signal(rb_vm_t *, int); - -static int -signal_vm(rb_vm_t *vm, void *sig) -{ - ruby_vm_send_signal(vm, (int)sig); - return Qtrue; -} - static RETSIGTYPE sighandler(int sig) { - ruby_vm_foreach(signal_vm, (void *)sig); + ATOMIC_INC(signal_buff.cnt[sig]); + ATOMIC_INC(signal_buff.size); #if !defined(BSD_SIGNAL) && !defined(POSIX_SIGNAL) ruby_signal(sig, sighandler); #endif @@ -560,6 +532,26 @@ #endif } +int +rb_get_next_signal(void) +{ + int i, sig = 0; + + for (i=1; i<RUBY_NSIG; i++) { + if (signal_buff.cnt[i] > 0) { + rb_disable_interrupt(); + { + ATOMIC_DEC(signal_buff.cnt[i]); + ATOMIC_DEC(signal_buff.size); + } + rb_enable_interrupt(); + sig = i; + break; + } + } + return sig; +} + #ifdef SIGBUS static RETSIGTYPE sigbus(int sig) @@ -609,13 +601,13 @@ #endif static void -signal_exec(VALUE cmd, int sig) +signal_exec(VALUE cmd, int safe, int sig) { rb_proc_t *proc; VALUE signum = INT2FIX(sig); if (TYPE(cmd) == T_STRING) { - rb_eval_cmd(cmd, rb_ary_new3(1, signum), trap_list[sig].safe); + rb_eval_cmd(cmd, rb_ary_new3(1, signum), safe); return; } GetProcPtr(cmd, proc); @@ -625,20 +617,21 @@ void rb_trap_exit(void) { -#ifndef MACOS_UNUSE_SIGNAL - if (trap_list[0].cmd) { - VALUE trap_exit = trap_list[0].cmd; + rb_vm_t *vm = GET_VM(); + VALUE trap_exit = vm->trap_list[0].cmd; - trap_list[0].cmd = 0; - signal_exec(trap_exit, 0); + if (trap_exit) { + vm->trap_list[0].cmd = 0; + signal_exec(trap_exit, vm->trap_list[0].safe, 0); } -#endif } void rb_signal_exec(rb_thread_t *th, int sig) { - VALUE cmd = rb_get_trap_cmd(sig); + rb_vm_t *vm = GET_VM(); + VALUE cmd = vm->trap_list[sig].cmd; + int safe = vm->trap_list[sig].safe; if (cmd == 0) { switch (sig) { @@ -671,26 +664,10 @@ rb_thread_signal_exit(th); } else { - signal_exec(cmd, sig); + signal_exec(cmd, safe, sig); } } -void -rb_trap_exec(void) -{ -#ifndef MACOS_UNUSE_SIGNAL - int i; - - for (i=0; i<NSIG; i++) { - if (trap_pending_list[i]) { - trap_pending_list[i] = 0; - rb_signal_exec(GET_THREAD(), i); - } - } -#endif /* MACOS_UNUSE_SIGNAL */ - rb_trap_pending = 0; -} - struct trap_arg { #if USE_TRAP_MASK # ifdef HAVE_SIGPROCMASK @@ -851,9 +828,10 @@ sighandler_t oldfunc, func = arg->func; VALUE oldcmd, command = arg->cmd; int sig = arg->sig; + rb_vm_t *vm = GET_VM(); oldfunc = ruby_signal(sig, func); - oldcmd = trap_list[sig].cmd; + oldcmd = vm->trap_list[sig].cmd; switch (oldcmd) { case 0: if (oldfunc == SIG_IGN) oldcmd = rb_str_new2("IGNORE"); @@ -865,8 +843,8 @@ break; } - trap_list[sig].cmd = command; - trap_list[sig].safe = rb_safe_level(); + vm->trap_list[sig].cmd = command; + vm->trap_list[sig].safe = rb_safe_level(); /* enable at least specified signal. */ #if USE_TRAP_MASK #ifdef HAVE_SIGPROCMASK @@ -1033,7 +1011,7 @@ if (oldfunc != SIG_DFL && oldfunc != SIG_IGN) { ruby_signal(sig, oldfunc); } else { - trap_list[sig].cmd = 0; + GET_VM()->trap_list[sig].cmd = 0; } #if USE_TRAP_MASK -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/