[Momonga-devel.ja:01369] Re: OmoiKondaraでのTimeout


むらけんです.

In message <20030208220038.84AA.CIPHER@xxxxxxxxxxxxxxxx> at Sat, 08 Feb 2003 22:03:01 +0900,
Akira Shibata <cipher@xxxxxxxxxxxxxxxx> wrote:
> ruby系のエラーだからあまり疑わなかったのですが。

OmoiKondara のコード (特に 200 行辺り) を良く見てください.

      timeout (sec) do
        r = gets
      end

この部分です.zunda さんが gcc_2_96 を無事パッケージングできる
ようにするために施した修正です.

そして,併わせて timeout.rb を見てください.timeout.rb は ruby 
に標準添付のライブラリです.

    x = Thread.current
    y = Thread.start {
      sleep sec
      x.raise TimeoutError, "execution expired" if x.alive?
    }
    yield sec

こうなってますよね.

要するに,r = gets を実行しているスレッドで gets が60秒間の間
うんともすんとも言わなかったら,別のスレッドが gets を待ってい
るスレッドに例外を投げるんです.

しかし

In message <20030208002432.6E0C.CIPHER@xxxxxxxxxxxxxxxx> at Sat, 08 Feb 2003 00:35:32 +0900,
Akira Shibata <cipher@xxxxxxxxxxxxxxxx> wrote:
> PollVec::Block: BUG - deadlock detected
> Pol../tools/OmoiKondara:201:in `gets': Interrupt

これは意図した例外ではないのですが,理由はだいたいわかるでしょ
う.gets でファイルデスクリプタから入力待ちしている状態で,シ
グナルが発生したんです.

なので,BUG と出ていますが,Ruby 側のバグでは無いと考えられます.

-- 
1024D/2A3FDBE6 2001-08-26 Kenta MURATA (MURAKEN) <muraken2@xxxxxxxxx>
Key fingerprint = 622A 61D3 280F 4991 4833  5724 8E2D C5E1 2A3F DBE6