永井@知能.九工大です.

From: Hidetoshi NAGAI <nagai / ai.kyutech.ac.jp>
Subject: [ruby-dev:25749] Re: pthread trouble on sighandler
Date: Wed, 23 Feb 2005 00:35:07 +0900
Message-ID: <20050223.003454.74737078.nagai / ai.kyutech.ac.jp>
> そうしますと,ruby スレッドでない pthread で
> ruby のシグナルハンドラがシグナルを受け取った場合、
> その pthread でこれ以上シグナルを受け取らないように 
> pthread_sigmask で設定して pthread_kill で ruby 
> スレッドに送り直すようにしなければならないのでしょうか?

私もよくわからないので叩き台としてのパッチを作るとすると,
イメージとしては添付のようなものでしょうか?
ただし,これはとりあえずの linux 環境のみのためのもので,
Win 環境ではコンパイルできません.(^_^;
Win での対応する関数を知らないためですので,
どなたか書き換えてくださいませ.

Index: signal.c
===================================================================
RCS file: /var/cvs/src/ruby/signal.c,v
retrieving revision 1.57
diff -u -r1.57 signal.c
--- signal.c	22 Feb 2005 14:50:33 -0000	1.57
+++ signal.c	22 Feb 2005 16:05:54 -0000
@@ -436,6 +436,29 @@
     }
 }
 
+void
+sigsend_to_ruby_thread(sig)
+    int sig;
+{
+#ifdef HAVE_NATIVETHREAD
+# ifdef HAVE_SIGPROCMASK
+    sigset_t mask, old_mask;
+# else
+    int mask, old_mask;
+# endif
+
+#ifdef HAVE_SIGPROCMASK
+    sigfillset(&mask);
+    sigprocmask(SIG_BLOCK, &mask, &old_mask);
+#else
+    mask = sigblock(~0);
+    sigsetmask(mask);
+#endif
+
+    ruby_native_thread_kill(sig);
+#endif
+}
+
 static RETSIGTYPE sighandler _((int));
 static RETSIGTYPE
 sighandler(sig)
@@ -452,7 +475,7 @@
 
 #ifdef HAVE_NATIVETHREAD
     if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
-        /* ignore signals on non-Ruby native thread */
+        sigsend_to_ruby_thread(sig);
         return;
     }
 #endif
@@ -483,7 +506,7 @@
 {
 #ifdef HAVE_NATIVETHREAD
     if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
-        /* ignore signals on non-Ruby native thread */
+        sigsend_to_ruby_thread(sig);
         return;
     }
 #endif
@@ -500,7 +523,7 @@
 {
 #ifdef HAVE_NATIVETHREAD
     if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
-        /* ignore signals on non-Ruby native thread */
+        sigsend_to_ruby_thread(sig);
         return;
     }
 #endif
@@ -572,7 +595,7 @@
 {
 #ifdef HAVE_NATIVETHREAD
     if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
-        /* ignore signals on non-Ruby native thread */
+        sigsend_to_ruby_thread(sig);
         return;
     }
 #endif
Index: eval.c
===================================================================
RCS file: /var/cvs/src/ruby/eval.c,v
retrieving revision 1.755
diff -u -r1.755 eval.c
--- eval.c	22 Feb 2005 14:57:43 -0000	1.755
+++ eval.c	22 Feb 2005 16:05:56 -0000
@@ -1241,6 +1241,12 @@
 is_ruby_native_thread() {
     return NATIVETHREAD_EQUAL(ruby_thid, NATIVETHREAD_CURRENT());
 }
+void
+ruby_native_thread_kill(sig)
+    int sig;
+{
+    NATIVETHREAD_KILL(ruby_thid, sig);
+}
 #endif
 
 NORETURN(static void rb_thread_start_1 _((void)));


-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai / ai.kyutech.ac.jp