[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]