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

ruby-changes:20462

From: kosaki <ko1@a...>
Date: Mon, 11 Jul 2011 02:04:51 +0900 (JST)
Subject: [ruby-changes:20462] kosaki:r32510 (trunk): * thread_pthread.c (rb_thread_create_timer_thread): removed

kosaki	2011-07-11 02:04:40 +0900 (Mon, 11 Jul 2011)

  New Revision: 32510

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32510

  Log:
    * thread_pthread.c (rb_thread_create_timer_thread): removed
      rb_disable_interrupt()/rb_enable_interrupt().
    * vm_core.h: ditto.
    * process.c (static void before_exec): ditto.
    * process.c (static void after_exec): ditto.
      [Bug #4765] [ruby-dev:43571]
    
    * eval_intern.h: removed rb_trap_restore_mask().
    * vm_eval.c (rb_throw_obj): ditto.
    * eval.c (setup_exception): ditto.
    
    * signal.c: removed trap_last_mask.
    * signal.c (trap_restore_mask): removed.
    * signal.c (init_sigchld): comment clarification why signal block
      is needed. and removed trap_last_mask operation.
    * signal.c (trap_ensure): removed trap_last_mask operation.
    
    * signal.c (rb_disable_interrupt, rb_enable_interrupt): made
      static and removed sigdelset(SIGVTALARM) and sigdelset(SIGSEGV).
    
    * process.c (rb_syswait): removed implicit signal handler change.

  Modified files:
    trunk/ChangeLog
    trunk/eval.c
    trunk/eval_intern.h
    trunk/process.c
    trunk/signal.c
    trunk/thread_pthread.c
    trunk/vm_core.h
    trunk/vm_eval.c

Index: eval_intern.h
===================================================================
--- eval_intern.h	(revision 32509)
+++ eval_intern.h	(revision 32510)
@@ -213,7 +213,6 @@
 void rb_thread_terminate_all(void);
 VALUE rb_vm_top_self();
 VALUE rb_vm_cbase(void);
-void rb_trap_restore_mask(void);
 
 #ifndef CharNext		/* defined as CharNext[AW] on Windows. */
 #define CharNext(p) ((p) + mblen((p), RUBY_MBCHAR_MAXSIZE))
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32509)
+++ ChangeLog	(revision 32510)
@@ -1,3 +1,27 @@
+Mon Jul 11 01:16:27 2011  KOSAKI Motohiro  <kosaki.motohiro@g...>
+
+	* thread_pthread.c (rb_thread_create_timer_thread): removed
+	  rb_disable_interrupt()/rb_enable_interrupt().
+	* vm_core.h: ditto.
+	* process.c (static void before_exec): ditto.
+	* process.c (static void after_exec): ditto.
+	  [Bug #4765] [ruby-dev:43571]
+
+	* eval_intern.h: removed rb_trap_restore_mask().
+	* vm_eval.c (rb_throw_obj): ditto.
+	* eval.c (setup_exception): ditto.
+
+	* signal.c: removed trap_last_mask.
+	* signal.c (trap_restore_mask): removed.
+	* signal.c (init_sigchld): comment clarification why signal block
+	  is needed. and removed trap_last_mask operation.
+	* signal.c (trap_ensure): removed trap_last_mask operation.
+
+	* signal.c (rb_disable_interrupt, rb_enable_interrupt): made
+	  static and removed sigdelset(SIGVTALARM) and sigdelset(SIGSEGV).
+
+	* process.c (rb_syswait): removed implicit signal handler change.
+
 Sun Jul 10 23:49:12 2011  Yuki Sonoda (Yugui)  <yugui@y...>
 
 	* docs/NEWS-1.9.3: moved from NEWS.
Index: thread_pthread.c
===================================================================
--- thread_pthread.c	(revision 32509)
+++ thread_pthread.c	(revision 32510)
@@ -1159,8 +1159,6 @@
 static void
 rb_thread_create_timer_thread(void)
 {
-    rb_enable_interrupt();
-
     if (!timer_thread_id) {
 	pthread_attr_t attr;
 	int err;
@@ -1223,8 +1221,6 @@
 	    exit(EXIT_FAILURE);
 	}
     }
-
-    rb_disable_interrupt(); /* only timer thread recieve signal */
 }
 
 static int
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 32509)
+++ vm_core.h	(revision 32510)
@@ -634,8 +634,6 @@
 #endif
 VALUE rb_iseq_eval(VALUE iseqval);
 VALUE rb_iseq_eval_main(VALUE iseqval);
-void rb_enable_interrupt(void);
-void rb_disable_interrupt(void);
 #if defined __GNUC__ && __GNUC__ >= 4
 #pragma GCC visibility pop
 #endif
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 32509)
+++ vm_eval.c	(revision 32510)
@@ -1441,7 +1441,6 @@
 	RB_GC_GUARD(desc);
 	rb_raise(rb_eArgError, "uncaught throw %s", RSTRING_PTR(desc));
     }
-    rb_trap_restore_mask();
     th->errinfo = NEW_THROW_OBJECT(tag, 0, TAG_THROW);
 
     JUMP_TAG(TAG_THROW);
Index: eval.c
===================================================================
--- eval.c	(revision 32509)
+++ eval.c	(revision 32510)
@@ -430,8 +430,6 @@
 	JUMP_TAG(TAG_FATAL);
     }
 
-    rb_trap_restore_mask();
-
     if (tag != TAG_FATAL) {
 	EXEC_EVENT_HOOK(th, RUBY_EVENT_RAISE, th->cfp->self, 0, 0);
     }
Index: process.c
===================================================================
--- process.c	(revision 32509)
+++ process.c	(revision 32510)
@@ -992,12 +992,6 @@
 
 static void before_exec(void)
 {
-    /*
-     * signalmask is inherited across exec() and almost system commands don't
-     * work if signalmask is blocked.
-     */
-    rb_enable_interrupt();
-
 #ifdef SIGPIPE
     /*
      * Some OS commands don't initialize signal handler properly. Thus we have
@@ -1028,7 +1022,6 @@
 #endif
 
     forked_child = 0;
-    rb_disable_interrupt();
 }
 
 #define before_fork() before_exec()
@@ -2947,43 +2940,9 @@
 void
 rb_syswait(rb_pid_t pid)
 {
-    static int overriding;
-#ifdef SIGHUP
-    RETSIGTYPE (*hfunc)(int) = 0;
-#endif
-#ifdef SIGQUIT
-    RETSIGTYPE (*qfunc)(int) = 0;
-#endif
-    RETSIGTYPE (*ifunc)(int) = 0;
     int status;
-    int i, hooked = FALSE;
 
-    if (!overriding) {
-#ifdef SIGHUP
-	hfunc = signal(SIGHUP, SIG_IGN);
-#endif
-#ifdef SIGQUIT
-	qfunc = signal(SIGQUIT, SIG_IGN);
-#endif
-	ifunc = signal(SIGINT, SIG_IGN);
-	overriding = TRUE;
-	hooked = TRUE;
-    }
-
-    do {
-	i = rb_waitpid(pid, &status, 0);
-    } while (i == -1 && errno == EINTR);
-
-    if (hooked) {
-#ifdef SIGHUP
-	signal(SIGHUP, hfunc);
-#endif
-#ifdef SIGQUIT
-	signal(SIGQUIT, qfunc);
-#endif
-	signal(SIGINT, ifunc);
-	overriding = FALSE;
-    }
+    rb_waitpid(pid, &status, 0);
 }
 
 static VALUE
Index: signal.c
===================================================================
--- signal.c	(revision 32509)
+++ signal.c	(revision 32510)
@@ -519,27 +519,21 @@
     return signal_buff.size;
 }
 
-#if USE_TRAP_MASK
-static sigset_t trap_last_mask;
-#endif
-
 #if HAVE_PTHREAD_H
 #include <pthread.h>
 #endif
 
-void
+static void
 rb_disable_interrupt(void)
 {
 #if USE_TRAP_MASK
     sigset_t mask;
     sigfillset(&mask);
-    sigdelset(&mask, SIGVTALRM);
-    sigdelset(&mask, SIGSEGV);
     pthread_sigmask(SIG_SETMASK, &mask, NULL);
 #endif
 }
 
-void
+static void
 rb_enable_interrupt(void)
 {
 #if USE_TRAP_MASK
@@ -872,19 +866,10 @@
 {
     /* enable interrupt */
     pthread_sigmask(SIG_SETMASK, &arg->mask, NULL);
-    trap_last_mask = arg->mask;
     return 0;
 }
 #endif
 
-void
-rb_trap_restore_mask(void)
-{
-#if USE_TRAP_MASK
-    pthread_sigmask(SIG_SETMASK, &trap_last_mask, NULL);
-#endif
-}
-
 /*
  * call-seq:
  *   Signal.trap( signal, command ) -> obj
@@ -995,7 +980,12 @@
     sigset_t mask;
     sigset_t fullmask;
 
-    /* disable interrupt */
+    /*
+     * disable interrupt. Otherwise following temmporal signal handler change
+     * has a race.
+     * Note: now we have only single thread, therefore both sigprocmask() and
+     * pthread_sigmask() makes the same effect.
+     */
     sigfillset(&fullmask);
     pthread_sigmask(SIG_BLOCK, &fullmask, &mask);
 #endif
@@ -1010,7 +1000,6 @@
 #if USE_TRAP_MASK
     sigdelset(&mask, sig);
     pthread_sigmask(SIG_SETMASK, &mask, NULL);
-    trap_last_mask = mask;
 #endif
 }
 #endif

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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