[#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:25754] Re: pthread trouble on sighandler

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2005-02-23 15:22:33 UTC
List: ruby-dev #25754
山本です。

>> そうしますと,ruby スレッドでない pthread で
>> ruby のシグナルハンドラがシグナルを受け取った場合、
>> その pthread でこれ以上シグナルを受け取らないように 
>> pthread_sigmask で設定して pthread_kill で ruby 
>> スレッドに送り直すようにしなければならないのでしょうか?

どうも Windows ではその必要はないようです。というのも、
過去ログを調べたところ、[ruby-dev:10725] や [ruby-dev:10832] で
同じような問題が(SIGINT が別スレッドから送られて SEGV)あったようなのですが、
signal.c (sighandler) の IN_MAIN_CONTEXT の部分で対処済みでした。

# pthread_kill の代替が不可能なために別の方法が用意されたようです。

幸い HAVE_NATIVETHREAD なのは Windows と pthread だけのようなので、
当面は下のような感じで対処すれば十分なのではないかと思います。

# 下のパッチはあくまで「感じ」です。相当手抜いてます。

Index: eval.c
===================================================================
RCS file: /src/ruby/eval.c,v
retrieving revision 1.755
diff -u -w -b -p -r1.755 eval.c
--- eval.c	22 Feb 2005 14:57:43 -0000	1.755
+++ eval.c	23 Feb 2005 09:04:01 -0000
@@ -1241,6 +1241,10 @@ int
 is_ruby_native_thread() {
     return NATIVETHREAD_EQUAL(ruby_thid, NATIVETHREAD_CURRENT());
 }
+rb_nativethread_t
+ruby_native_thread() {
+    return ruby_thid;
+}
 #endif
 
 NORETURN(static void rb_thread_start_1 _((void)));

Index: ruby.h
===================================================================
RCS file: /src/ruby/ruby.h,v
retrieving revision 1.109
diff -u -w -b -p -r1.109 ruby.h
--- ruby.h	17 Nov 2004 02:27:36 -0000	1.109
+++ ruby.h	23 Feb 2005 09:20:09 -0000
@@ -702,6 +702,7 @@ typedef DWORD rb_nativethread_t;
 #endif
 #ifdef HAVE_NATIVETHREAD
 RUBY_EXTERN int is_ruby_native_thread();
+RUBY_EXTERN rb_nativethread_t ruby_native_thread();
 #else
 #define is_ruby_native_thread() (1)
 #endif

Index: signal.c
===================================================================
RCS file: /src/ruby/signal.c,v
retrieving revision 1.55
diff -u -w -b -p -r1.55 signal.c
--- signal.c	30 Nov 2004 17:28:16 -0000	1.55
+++ signal.c	23 Feb 2005 08:59:36 -0000
@@ -417,6 +417,12 @@ sighandler(sig)
     ruby_signal(sig, sighandler);
 #endif
 
+#if defined(HAVE_NATIVETHREAD) && defined(HAVE_LIBPTHREAD)
+    if (!is_ruby_native_thread()) {
+	pthread_kill(ruby_native_thread(), sig);
+    }
+#endif
+
     if (trap_list[sig].cmd == 0 && ATOMIC_TEST(rb_trap_immediate)) {
 	IN_MAIN_CONTEXT(signal_exec, sig);
 	ATOMIC_SET(rb_trap_immediate, 1);


In This Thread