From: Hidetoshi NAGAI Date: 2005-02-23T01:11:33+09:00 Subject: [ruby-dev:25750] Re: pthread trouble on sighandler 永井@知能.九工大です. From: Hidetoshi NAGAI 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