[ruby-dev:31903] Re: 拡張ライブラリ内での SIGVTALRM

From: とみたまさひろ <tommy@...>
Date: 2007-09-29 13:16:58 UTC
List: ruby-dev #31903
とみたです。

On Wed, 26 Sep 2007 00:21:26 +0900
とみたまさひろ <tommy@tmtm.org> wrote:

> 了解です。Ruby のリコンパイルができる状況であれば、configure
> --enable-pthread でも解決しますよね。おそらく。
    〜〜
> とりあえず、--enable-pthread を試してみてと伝えておきました。

解決しなかったようです (--;

eval.c の thread_timer() がシステムコール中に SIGVTALRM を送ることがあ
るようで…。

|        if (!rb_thread_critical) {
|            rb_thread_pending = 1;
|            if (rb_trap_immediate) {                  ← (a)
|                pthread_kill(ruby_thid, SIGVTALRM);   ← (b)
|            }
|        }

この辺りのコードって、何の排他制御もなしに rb_thread_critical や
rb_trap_immediate 変数が参照されているようなんですが、問題ないんでしょ
うか。

(a) では rb_trap_immediate は 1 だったけど、(b) の時点では 0 になってい
て、メインスレッド処理の変なところで割り込みが入るなんてことはない?


ところで、色々試しててわかったんですが、Ruby のスレッドは、相手がいない
パイプの open ではブロックしちゃうんですね。今まで知りませんでした。

$ mknod /tmp/pipe p
$ ruby -e 'Thread.new{sleep 0.1; File.open("/tmp/pipe")}; 10000.times{|i| p i}'

-- 
とみたまさひろ <tommy@tmtm.org>
3469 42CC 4D32 F53C AD98  65A5 8C37 FF09 69C1 6040

In This Thread