From: matz@... (Yukihiro Matsumoto) Date: 1998-03-16T11:55:38+09:00 Subject: [ruby-dev:1797] Re: trap and throw problem まつもと ゆきひろです In message "[ruby-dev:1795] Re: trap and throw problem" on 98/03/16, Yukihiro Matsumoto writes: |まつもと ゆきひろです ||trapのイテレータブロックの中でthrowを行なうと, シグナルがマスクされた ||ままになってしまっているようです. | |ふーむ,なんででしょうね.というのもシグナルハンドラではシグ |ナルのマスクを行っていないので「マスクされたまま」というのは |考えにくいのですが….sigaction(2)の仕様なんでしょうか? どうもそのようなので(ちっ),パッチを書いてみました.どうも動 いているようですが,検証して下さる方はいらっしゃいませんか? 特ににlinux以外(でsignal maskのある)OSでの動作実績が知りたい です. diff -u -1 -r1.1.1.1.4.1 sig.h --- sig.h 1998/01/16 12:35:48 1.1.1.1.4.1 +++ sig.h 1998/03/16 02:52:52 @@ -22,2 +22,4 @@ extern int trap_pending; +void trap_restore_mask _((void)); + #ifdef THREAD diff -u -1 -r1.1.1.1.4.1 signal.c --- signal.c 1998/01/16 12:35:48 1.1.1.1.4.1 +++ signal.c 1998/03/16 02:52:52 @@ -360,2 +360,8 @@ +# ifdef HAVE_SIGPROCMASK +static sigset_t trap_last_mask; +# else +static int trap_last_mask; +# endif + static RETSIGTYPE @@ -478,4 +484,17 @@ #endif + trap_last_mask = arg->mask; } #endif + +void +trap_restore_mask() +{ +#ifndef NT +# ifdef HAVE_SIGPROCMASK + sigprocmask(SIG_SETMASK, &trap_last_mask, NULL); +# else + sigsetmask(trap_last_mask); +# endif +#endif +} diff -u -1 -r1.1.1.2.2.23 eval.c --- eval.c 1998/03/13 09:04:29 1.1.1.2.2.23 +++ eval.c 1998/03/16 02:52:52 @@ -2624,2 +2624,3 @@ + trap_restore_mask(); JUMP_TAG(tag); @@ -6158,2 +6159,3 @@ } + trap_restore_mask(); JUMP_TAG(TAG_THROW);