NULL::something

Login via flickr, はてな, TypeKey.

2004-09-16

Ruby 時間制限付きでユーザコードを実行する。

IRC BOT に Ruby 式評価する機能でもと。

def safe(lvl, tm=1)
    result = nil
    Thread::start(lvl, tm) do |level, time|
        $SAFE = level
        Thread::exclusive do
            timeout(time) do
                tl = Thread::list
                result = yield
                (Thread::list - tl).each {|th| th.join}
            end
        end
    end.join
    result
end

果たしてこれでいいかは不明だけど、たぶんちゃんと動いてる。Thread.start { loop { sleep 0.1 } }; Thread.start { loop {sleep 0.1} } みたいなのを投げても大丈夫。でも何かデッドロッ(あqwせdrftgyふじこlp

Inserted at 2004-09-16T17:23:17+09:00

だめだ。上のじゃだめ。やっぱデッドロックしてるっぽい(Thread::critical = true してみればエラーになる。 exclusive はエラー処理やってるから分からないだけだ)。他のスレッドに処理が移ってスレッド作られると困るから exclusive してるんだけど、なんか上手くいってない。とりあえず今のところ他のスレッドで新しいスレッド作ることはないから exclusive をコメントアウト。

まぁ原因は (Thread::list - tl) なんだけど。何故か全部のスレッドが入ってる。

Inserted at 2004-09-16T17:23:28+09:00

よく分からないけど書き換え。critical 設定するとダメくさいのでもうアレやこれや。

def safe(lvl, tm=1)
    result = nil
    tl = Thread::list
    t = Thread::start(lvl) do |level|
        $SAFE = level
        result = yield
    end.join(tm)
    (Thread::list - tl).each {|th| th.kill}
    raise TimeoutError unless t
    result
end

Inserted at 2004-09-16T18:01:25+09:00

Trackback URI: http://lowreal.net/logs/2004/09/16/1.trackback

NULL

RSS feed meter for http://lowreal.net/logs/latest

Alternates

  1. RSS 1.0
  2. Atom 1.0

Generated with Taglibro

この日記は Taglibro と呼ばれる XML ベースの XSLT をテンプレートとして使ったシステムを使っています。現在の Taglibro は Ruby, ruby-xslt, libxml-ruby による実装です。ソースコードはとりあえず公開していません。