[#25636] [Oniguruma 3.X] reggnu.c — "K.Kosako" <sndgk393@...>

さっき気がついたのですが、元々は

15 messages 2005/02/05

[#25655] openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths — Tanaka Akira <akr@...17n.org>

open-uri で https を扱うことを考えていろいろと調べていた所、openssl で、

9 messages 2005/02/08
[#25670] Re: openssl binding for SSL_CTX_set_default_verify_paths and X509_STORE_set_default_paths — GOTOU Yuuzou <gotoyuzo@...> 2005/02/10

In message <876513vce0.fsf@serein.a02.aist.go.jp>,

[#25713] pthread trouble on sighandler — Hidetoshi NAGAI <nagai@...>

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

17 messages 2005/02/18
[#25714] Re: pthread trouble on sighandler — Yukihiro Matsumoto <matz@...> 2005/02/18

まつもと ゆきひろです

[#25755] I/O operation differs signal handler — Minero Aoki <aamine@...>

青木です。

14 messages 2005/02/24
[#25756] Re: I/O operation differs signal handler — Tanaka Akira <akr@...17n.org> 2005/02/24

In article <20050224091450P.aamine@loveruby.net>,

[ruby-dev:25750] Re: pthread trouble on sighandler

From: Hidetoshi NAGAI <nagai@...>
Date: 2005-02-22 16:11:33 UTC
List: ruby-dev #25750
永井@知能.九工大です.

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

In This Thread